如何在C#属性(注释)中放置Func?

我有一个C#注释,它是:

[AttributeUsage(AttributeTargets.Method)] public class OperationInfo : System.Attribute { public enum VisibilityType { GLOBAL, LOCAL, PRIVATE } public VisibilityType Visibility { get; set; } public string Title { get; set; } public Func<List, List> Func; public OperationInfo(VisibilityType visibility, string title, Func<List, List> function) { Visibility = visibility; Title = title; Func = function; } } 

如您所见,有一个属性是Func,我想动态调用它。 基本上,我想解析具有此注释的所有方法,然后调用绑定到注释的Func。

我想像这样使用它(这是一个简单的echo函数示例,它获取一个字符串并返回相同的字符串):

 [OperationInfo(OperationInfo.VisibilityType.GLOBAL, "echo", IDoEcho)] public static string DoEcho(string a) { return a; } [OperationInfo(OperationInfo.VisibilityType.PRIVATE, null, null)] public static List IDoEcho(List param) { return new List() { DoEcho(param[0]) }; } 

我的Annotation类中没有错误,但是当重新生成整个解决方案时,每次我使用注释声明一个方法时我都会遇到一个错误,告诉我必须在注释中使用文字。

我知道有限制,但有什么办法可以避免这个问题吗? 我知道我可以使用字符串而不是Func,并动态查找其名称与字符串相同的函数,但我不想这样做。

谢谢你的帮助:)

我不认为这是可能的,c#只允许您使用具有常量值的Attributes。

这样做的一种方法是创建一个类而不是一个func,然后将该类的类型传递给该属性。 然后,您需要使用reflection对其进行实例化,并在其中执行一个方法。

所以一个例子是:

 public interface IDoStuff { IList Execute(); } 

那么你的属性将采用一种类型而不是一个Func

 public OperationInfo(VisibilityType v, string title, Type type) { ///... } 

然后,您将创建一个实现您的接口并将其传递给属性的类。 虽然这意味着(至少在最初,并且不知道您的问题),每次想要返回不同的结果时,您将需要创建一个新类。

来自C#规范:

17.1.3属性参数类型

属性类的位置和命名参数类型仅限于属性参数类型,它们是:

·以下类型之一:bool,byte,char,double,float,int,long,sbyte,short,string,uint,ulong,ushort。

·类型对象。

·System.Type类型。

·枚举类型,前提是它具有公共可访问性,并且嵌套类型(如果有)也具有公共可访问性(第17.2节)。

·上述类型的一维arrays。