2010-05-05 60 views
3

与反思,您可以在运行时字符串查找一个类,但你也可以说typeof运算(富),并获得编译时类型检查,自动完成等C#相当于使用typeof的领域

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

编辑:我想用这个的一个例子,说我有一个可能已经从数据库中读取的对象列表,我想在DataGridView中显示它们,但我只想显示某些领域的专栏。我想写一个方法是这样的:

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

,并可以调用它像

DisplayData(accounts, fieldof(Account.Name), fieldof(Account.Email)); 

那种想法。

+0

一小段代码来说明你的问题将帮助你得到更好的答案 – 2010-05-05 22:59:56

+0

听起来你可能会从多个程序集中拉相同类型的类。如果是这样,你可能要考虑使用一个接口,并进行编译时检查。然后,您可以将实例变量分配给动态加载的程序集,一切都会好的。 – 2010-05-05 23:01:37

+0

gbogumil - 只是一个程序集,但在代码中我想对不同类的不同字段执行特定操作的几个地方,因此需要能够指定哪些字段。我已经添加了一个希望可以澄清的代码示例。 – rwallace 2010-05-05 23:08:04

回答

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); 
0

不为场摆脱的字符串文字。 最接近你可以得到的是'使用别名',它允许你指定类型的替代名称: 例如,使用foo = System.Collections.Generic.List;