【问题标题】:Get Attribute from Function<T>从 Function<T> 获取属性
【发布时间】:2015-09-30 02:52:08
【问题描述】:

如何从 Function 对象中获取自定义属性?

public static void Main(string[] args) {

    Func<object> fun = () => Foo();

    //fun. Get Foo Custom Attribute
}

[CustomAttrib]
public static object Foo() {
    return new object();
}

【问题讨论】:

  • this
  • 副本不正确 - 这要困难得多,因为该方法位于 Function 内。
  • 您是否需要在不实际调用委托并检查检索到的对象的情况下执行此操作?
  • 我将更改代码以通过接口而不是Func&lt;T&gt; 获取工厂对象。工厂接口应该有一个返回对象新实例的方法,以及一个返回有关它可以生成的对象类型的元数据/信息的方法,使其成为您拥有所有部分的编译器检查合同的一部分。一个函数或表达式会变得脆弱,仅仅一个 if 语句就会让你编写的任何代码无法工作。

标签: c# lambda custom-attributes


【解决方案1】:

使用Function,AFAIK 无法获得您要查找的信息。

不过,如果是Expression,那就很简单了:

Expression<Func<object>> expression = () => Foo();
var method = ((MethodCallExpression)expression.Body).Method;
Console.WriteLine(method.GetCustomAttributes(false)[0]);

您可以使用Compile() 方法将Expression 转换为Function

var fun = expression.Compile();

如果您自己定义 Function,这可能会有所帮助,但如果来自某些您无法修改的第 3 方代码,则不会。

【讨论】:

  • 我的建议是完全放弃该功能,并使用更具体的接口来声明所有内容。尽管使用表达式而不是委托可以更容易地检查表达式中的代码,但仍然很难采用“所有表达式”并能够处理它们。一个返回两种不同对象类型的简单 if 语句将在其中抛出一个扳手。
猜你喜欢
  • 2018-12-26
  • 1970-01-01
  • 2020-04-20
  • 2017-11-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2012-12-17
  • 1970-01-01
相关资源
最近更新 更多