所以我使用以下实用程序从类的实例中获取字段/属性的名称...
public static string FieldName<T>(Expression<Func<T>> Source)
{
return ((MemberExpression)Source.Body).Member.Name;
}
这允许我执行以下操作:
public class CoolCat
{
public string KaratePower;
}
public class Program
{
public static Main()
{
public CoolCat Jimmy = new CoolCat();
string JimmysKaratePowerField = FieldName(() => Jimmy.KaratePower);
}
}
这对于序列化很有用,有时我需要字段名称的字符串表示。
但是现在,我希望能够获得字段名称而没有类的实例 - 例如,如果我正在设置表并希望动态地将列的FieldNames链接到类中的实际字段(因此重构等不会破坏它。)
基本上,我觉得我还没有完全掌握如何实现这一目标的语法,但我想它看起来会像这样:
public static string ClassFieldName<T>(Func<T> PropertyFunction)
{
// Do something to get the field name? I'm not sure whether 'Func' is the right thing here - but I would imagine that it is something where I could pass in a lambda type expression or something of the sort?
}
public class Program
{
public static Main()
{
string CatsPowerFieldName = ClassFieldName<CoolCat>((x) => x.KaratePower);
// This 'CatsPowerFieldName' would be set to "KaratePower".
}
}
我希望这是有道理的 - 我对这个主题的词汇不是很了解所以我知道这个问题有点模糊。
答案 0 :(得分:4)
您尝试做的是Microsoft创建System.Reflection的原因之一 试试this:
using System.Reflection; // reflection namespace
public static List<Type> GetClassPropertyNames(Type myClass)
{
PropertyInfo[] propertyInfos;
propertyInfos = myClass.GetProperties(BindingFlags.Public);
List<Type> propertyTypeNames = new List<Type>();
// write property names
foreach (PropertyInfo propertyInfo in propertyInfos)
{
propertyTypeNames .Add(propertyInfo.PropertyType);
}
return propertyNames;
}
答案 1 :(得分:3)
我有两种方法可以做到这一点。
第一种是可以在任何对象上使用的扩展方法。
public static string GetPropertyName<TEntity, TProperty>(this TEntity entity, Expression<Func<TEntity, TProperty>> propertyExpression)
{
return propertyExpression.PropertyName();
}
使用的是
public CoolCat Jimmy = new CoolCat();
string JimmysKaratePowerField = Jimmy.GetPropertyName(j => j.KaratePower);
当我没有物体时,我使用的第二个。
public static string PropertyName<T>(this Expression<Func<T, object>> propertyExpression)
{
MemberExpression mbody = propertyExpression.Body as MemberExpression;
if (mbody == null)
{
//This will handle Nullable<T> properties.
UnaryExpression ubody = propertyExpression.Body as UnaryExpression;
if (ubody != null)
{
mbody = ubody.Operand as MemberExpression;
}
if (mbody == null)
{
throw new ArgumentException("Expression is not a MemberExpression", "propertyExpression");
}
}
return mbody.Member.Name;
}
这可以像这样使用
string KaratePowerField = Extensions.PropertyName<CoolCat>(j => j.KaratePower);
答案 2 :(得分:2)
我相信使用Reflection在这里很有用。我现在没有和我在一起,但我相信你可以做类似的事情(类).GetMembers()。我的反思有点生疏。