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

Max*_*Max 25 c# reflection attributes

我有一个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<string>, List<string>> Func;

    public OperationInfo(VisibilityType visibility, string title, Func<List<string>, List<string>> function) {
        Visibility = visibility;
        Title = title;
        Func = function;
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,有一个属性是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<string> IDoEcho(List<string> param) {
        return new List<string>() { DoEcho(param[0]) };
    }
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢你的帮助:)

Seb*_*Piu 10

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

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

所以一个例子是:

public interface IDoStuff
{
    IList<string> Execute();
}
Run Code Online (Sandbox Code Playgroud)

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

public OperationInfo(VisibilityType v, string title, Type type)
{
   ///...
}
Run Code Online (Sandbox Code Playgroud)

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


sq3*_*33G 9

来自C#规范:

17.1.3属性参数类型

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

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

·类型对象.

·System.Type类型.

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

·上述类型的一维阵列.