C#相当于字段的typeof

时间:2010-05-05 22:54:04

标签: c# .net reflection

使用反射,您可以在运行时从字符串中查找类,但您也可以说typeof(Foo)并获得编译时类型检查,自动完成等。

如果你想要的是一个字段而不是一个类,你可以在运行时从一个字符串中查找它,但是如果你想要编译时类型检查等,还是要说像fieldof(Foo.Bar)吗?我事先知道了类和字段的名称,我希望能够在编译时引用该字段而不是运行时字符串查找。

编辑:我想要使用它的一个例子,比如我有一个可能已从数据库中读取的对象列表,我想在DataGridView中显示它们,但我只想显示列对于某些领域。我想写一个类似的方法:

void DisplayData(object[] objs, params FieldInfo[] fields)

并且可以像

一样调用它
DisplayData(accounts, fieldof(Account.Name), fieldof(Account.Email));

那种想法。

2 个答案:

答案 0 :(得分:5)

您可以使用表达式删除字符串文字

public static PropertyInfo GetProperty<T>(Expression<Func<T, object>> expression)
{
    MemberExpression memberExpression = null;

    if (expression.Body.NodeType == ExpressionType.Convert)
    {
        memberExpression = ((UnaryExpression)expression.Body).Operand as MemberExpression;
    }
    else if (expression.Body.NodeType == ExpressionType.MemberAccess)
    {
        memberExpression = expression.Body as MemberExpression;
    }

    return memberExpression.Member as PropertyInfo;
}

// usage:
PropertyInfo p = GetProperty<MyClass>(x => x.MyCompileTimeCheckedPropertyName);

答案 1 :(得分:0)

不适用于字段。 您可以获得的最接近的是“使用别名”,它允许您为类型指定替代名称: 例如,使用foo = System.Collections.Generic.List;