我有一个类叫prescription。它有其他类的属性。因此,例如,填充属性名将来自PDInt类,该类具有关于我需要的值的其他属性。
如果我想在Prescription类中设置fill属性的值它应该是这样的
Prescription p = new Prescription();
p.Fills.Value = 33;
现在我想取填充属性的名称并将其填充到winform控件的标签属性中。
this.txtFills.Tag = p.Fills.GetType().Name;
然而,当我这样做时,我得到的是属性的基类,而不是属性名。所以我得到的不是" fill "而是"PDInt"
如何获得属性的实例化名称?
谢谢。
下面是一个扩展方法,当我想像你一样工作时,我使用它:
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);
有关方法工作原理的详细信息,请参见。net中的表达式树
查看这篇有用的博文:http://handcraftsman.wordpress.com/2008/11/11/how-to-get-c-property-names-without-magic-strings/
你需要使用。net框架的反射特性。
像这样
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;
}
你能得到这样的你吗?↓
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
}