Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将C#属性名作为带反射的字符串获取?_C#_Reflection - Fatal编程技术网

如何将C#属性名作为带反射的字符串获取?

如何将C#属性名作为带反射的字符串获取?,c#,reflection,C#,Reflection,可能重复: 我正在寻找一种将属性名作为字符串的方法,这样我就可以拥有一个“强类型”的神奇字符串。我需要做的是类似MyClass.SomeProperty.GetName()的操作,它将返回“SomeProperty”。这在C#中可能吗?您可以使用表达式很容易地实现这一点。看这个 这使得您可以通过lambda创建表达式,并提取名称。例如,可以对实现INotifyPropertyChanged进行返工,以执行以下操作: public int MyProperty { get { retur

可能重复:


我正在寻找一种将属性名作为字符串的方法,这样我就可以拥有一个“强类型”的神奇字符串。我需要做的是类似MyClass.SomeProperty.GetName()的操作,它将返回“SomeProperty”。这在C#中可能吗?

您可以使用表达式很容易地实现这一点。看这个

这使得您可以通过lambda创建表达式,并提取名称。例如,可以对实现INotifyPropertyChanged进行返工,以执行以下操作:

public int MyProperty {
    get { return myProperty; }
    set
    {
        myProperty = value;
        RaisePropertyChanged( () => MyProperty );
    }
}
string propertyName = Reflect.GetProperty(() => SomeProperty).Name;
为了映射等效对象,使用引用的“Reflect”类,您可以执行以下操作:

public int MyProperty {
    get { return myProperty; }
    set
    {
        myProperty = value;
        RaisePropertyChanged( () => MyProperty );
    }
}
string propertyName = Reflect.GetProperty(() => SomeProperty).Name;

Viola-没有魔术字符串的属性名。

您可以使用反射获得对象属性的列表

MyClass o;

PropertyInfo[] properties = o.GetType().GetProperties(
    BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance
);

每个属性都有一个Name属性,它将为您提供“SomeProperty”

这种方法比使用
表达式要快得多

public static string GetName<T>(this T item) where T : class
{
    if (item == null)
        return string.Empty;

    return typeof(T).GetProperties()[0].Name;
}

如果需要更高的性能,可以缓存值。请看这个重复的问题

这里的语法有点糟糕,但它确实起到了我所需要的作用。谢谢最好的答案在这里。我不想循环属性,我想基于实际属性获取属性名称。使用匿名类型,并且第一个(唯一)属性是您想要的名称来源是genius。@Paul我不是背后的天才。其次,它对重构不是很友好。我的意思是,如果更改属性的名称,匿名类型将保留原始名称。在这种情况下,如果将
SomeProperty
更改为
SomeProperty1
,则匿名类将更改为
new{SomeProperty=SomeProperty1}
,这将打印“SomeProperty”,而不是更新后的名称“SomeProperty1”。我会在回答中提到的。该死的。我不希望更改属性名称,但如果我更改了,我希望重构能够处理它。谢谢你让我知道。如果MyClass在执行时为null,这也会失败。表达方法将会成功。在绝大多数情况下,这不会成为问题,因为您将在其他地方获得null引用异常,但可能值得指出。@Pedro77您必须首先在静态类中编写扩展方法。