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)
然后,您将创建一个实现您的接口并将其传递给属性的类.虽然这意味着(至少在最初阶段,并且不知道您的问题),每次想要返回不同的结果时,您都需要创建一个新类.
来自C#规范:
17.1.3属性参数类型
属性类的位置和命名参数的类型仅限于属性参数类型,它们是:
·以下类型之一:bool,byte,char,double,float,int,long,sbyte,short,string,uint,ulong,ushort.
·类型对象.
·System.Type类型.
·枚举类型,前提是它具有公共可访问性,并且嵌套类型(如果有)也具有公共可访问性(第17.2节).
·上述类型的一维阵列.