C#获取类的非静态属性的名称

C#获取类的非静态属性的名称,c#,properties,instance,C#,Properties,Instance,我有一个问题与另一个问题非常相似: 他的解决方案以失败告终 // Static Property string name = GetPropertyName(() => SomeClass.SomeProperty); // Instance Property string name = GetPropertyName(() => someObject.SomeProperty); 我希望语法与Static属性类似,但与instance属性类似 原因是我现在有了使用反射来

我有一个问题与另一个问题非常相似:

他的解决方案以失败告终

// Static Property 
string name = GetPropertyName(() => SomeClass.SomeProperty); 

// Instance Property 
string name = GetPropertyName(() => someObject.SomeProperty); 
我希望语法与Static属性类似,但与instance属性类似

原因是我现在有了使用反射来获取集合中所有对象的属性值的代码,但我必须将其作为硬编码字符串传入

示例代码:

double Sum = AmountCollection.Sum("thatfield");  
好吧,这很有效,但是如果“thatfield”被重命名,代码将不再有效。编译器无法检查它,因为它只是一个字符串。同样,由于同样的原因,获取引用也不起作用

那么,有没有一种方法可以实现从实例属性轻松获取属性名称(即,只是一个函数调用)的目标

谢谢

试试这个:

string name = GetPropertyName(() => default(SomeClass).SomeInstanceProperty);
您可能会收到关于“始终导致System.NullReferenceException”的编译器警告,但实际上并未发生,因为您不执行表达式,这意味着您可以安全地放弃此警告。如果要删除它,请通过pragma禁用它,或者将
default()
调用移到如下函数中:

public static T Dummy<T>() {
  return default(T);
}

string name = GetPropertyName(() => Dummy<SomeClass>().SomeInstanceProperty);
publicstatict-Dummy(){
返回默认值(T);
}
字符串名称=GetPropertyName(()=>Dummy().SomeInstanceProperty);
对于C#6.0,您可以使用以下名称:

 nameof(SomeProperty)

这个表达式在编译时被解析为“SomeProperty”。

哦,我喜欢这样。它确实有效,只是测试了一下。我仍在创建一个对象,但它确实更干净。谢谢。@David,不,你不是在创建对象
default()
对于所有引用类型为
null
,对于值类型为空值(没有调用构造函数,没有分配堆内存)。@ChrisF,正如我所写的,如果曾经执行过表达式,则此警告是正确的。但是,它只用于提取元数据,这样就不会发生这种情况。现在,另一个问题的解决方案需要Lambda表达式和那个额外的函数,是否可以执行类似以下的操作:string NameOfProperty=typeof(default(AccountEntity).Email.Name;这段代码不起作用,但有点类似?我错误地提到了创建一个对象,这并不意味着,更确切地说,它正在做与该对象相关的额外工作。但是,在任何一种情况下,它都工作得很好而且很干净,但是看到我的最后一篇文章了吗?