【问题标题】:C# equivalent of typeof for fieldsC# 等效于字段的 typeof
【发布时间】:2010-05-06 13:19:31
【问题描述】:

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

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

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

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

并且可以这样称呼它

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

这种想法。

【问题讨论】:

  • 一小段代码来说明你的问题将帮助你得到更好的答案
  • 听起来您可能正在从多个程序集中提取相同类型的类。如果是这样,您可能需要考虑使用接口并针对该接口进行编译时类型检查。然后您可以将实例变量分配给动态加载的程序集,一切都会好起来的。
  • gbogumil - 只是一个程序集,但在代码中的几个地方我想对不同类的不同字段进行特定操作,因此需要能够指定哪些字段。我添加了一个代码示例,希望可以澄清。

标签: c# .net reflection


【解决方案1】:

您可以使用表达式摆脱字符串文字

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      • 2017-10-26
      • 2010-11-12
      • 2011-03-07
      • 1970-01-01
      相关资源
      最近更新 更多