2011-07-12 20 views
4

我有一个名为Prescriptions的类。它具有属于其他类的属性。因此,例如,Fills的属性名称将来自PDInt类,它具有关于我需要的值的其他属性。另一个对象内的对象名称

如果我想设置填充属性的值在处方类它会是这样的

Prescription p = new Prescription(); p.Fills.Value = 33;

所以现在我想在一个的填充性能和东西它的名字Winform控件中的标签属性。

this.txtFills.Tag = p.Fills.GetType().Name; 

但是,当我这样做,我得到属性的基类,而不是属性名称。所以我没有得到“填充”,而是得到“PDInt”。

如何获取属性的实例化名称?

谢谢。

+1

刚刚尝试谷歌搜索“C#反射属性名称”,先打http://www.csharp-examples.net/reflection-property-names/ –

+0

Astander,谢谢你的链接,但这不是我在找什么。我不想反映父类,并遍历它来查找单个属性。我想从我的类中填充一组具有属性名称的编辑控件,并且正在寻找一种方法来获取属于类的单个属性并获取它的实例化名称。 – MikeMalter

回答

7

下面是一个extension method,我使用它时,我想工作,像你这样的:

public static class ModelHelper 
{ 
    public static string Item<T>(this T obj, Expression<Func<T, object>> expression) 
    { 
     if (expression.Body is MemberExpression) 
     { 
      return ((MemberExpression)(expression.Body)).Member.Name; 
     } 
     if (expression.Body is UnaryExpression) 
     { 
      return ((MemberExpression)((UnaryExpression)(expression.Body)).Operand) 
        .Member.Name; 
     } 
     throw new InvalidOperationException(); 
    } 
} 

使用它作为:

var name = p.Item(x=>x.Fills); 

有关细节如何使用方法见Expression Tree in .Net

+0

+1其好朋友 –

+0

+1。伙计,我不相信你做到了。我需要的完美例子。我一直在外围看到Expression Trees。我将不得不重新梳理并学习更多。非常感谢你。 – MikeMalter

+0

@ MikeMalter,@ Pranay Rana,谢谢。 –

1

检查我这篇文章是有帮助的:http://handcraftsman.wordpress.com/2008/11/11/how-to-get-c-property-names-without-magic-strings/

做到这一点,你需要做的.NET Framework的反射功能的使用。

像这样的事情

Type type = test.GetType(); 

PropertyInfo[] propInfos = type.GetProperties(); 
for (int i = 0; i < propInfos.Length; i++) 
{ 
    PropertyInfo pi = (PropertyInfo)propInfos.GetValue(i); 
    string propName = pi.Name; 
} 
+1

U可以使用表达式树而不反映更多可用的代码。 –

+1

博客文章好,你的示例代码不好(这正是博客作者试图避免的) –

+0

@Ben Voigt - 谢谢你的回应......... –

0

你可以像这样让你喜欢吗? ↓

public class Prescription 
{ 
    public PDInt Fills; 
} 

public class PDInt 
{ 
    public int Value; 
} 




Prescription p = new Prescription(); 
foreach(var x in p.GetType().GetFields()) 
{ 
    // var type = x.GetType(); // PDInt or X //Fills 
} 
+0

斯科特,谢谢你的例子。我不想反映父类,并遍历它来查找单个属性。我想从我的类中填充一组具有属性名称的编辑控件,并且正在寻找一种方法来获取属于类的单个属性并获取它的实例化名称。合理? – MikeMalter

+0

@MikeMalter OH ...是的,我很抱歉,但我现在可以抓住你的意思了...而且我还发现了一个完美的例子....谢谢~~ – shenhengbin

相关问题