如何将Func放在C#属性(注释)中?
我有一个C#注释,它是:如何将Func放在C#属性(注释)中?,c#,reflection,attributes,C#,Reflection,Attributes,我有一个C#注释,它是: [AttributeUsage(AttributeTargets.Method)] public class OperationInfo : System.Attribute { public enum VisibilityType { GLOBAL, LOCAL, PRIVATE } public VisibilityType Visibility { get; set; } public
[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;
}
}
[AttributeUsage(AttributeTargets.Method)]
公共类操作信息:System.Attribute{
公共枚举可见性类型{
全球的,
地方的
私有的
}
公共可见性类型可见性{get;set;}
公共字符串标题{get;set;}
公共职能;
公共操作信息(VisibilityType可见性、字符串标题、函数){
能见度=能见度;
头衔=头衔;
Func=函数;
}
}
如您所见,有一个属性是Func,我想动态调用它。基本上,我想解析所有具有此注释的方法,然后调用绑定到注释的Func
我想这样使用它(这是一个简单的echo函数示例,它获取一个字符串并返回相同的字符串):
[OperationInfo(OperationInfo.VisibilityType.GLOBAL,“echo”,IDoEcho)]
公共静态字符串DoEcho(字符串a)
{
返回a;
}
[OperationInfo(OperationInfo.VisibilityType.PRIVATE,null,null)]
公共静态列表IDoEcho(列表参数){
返回新列表(){DoEcho(param[0])};
}
我的注释类中没有错误,但是在重新生成整个解决方案时,每次我用注释声明一个方法时,都会出现一个错误,它告诉我必须在注释中使用文本
我知道这是有局限性的,但是有什么方法可以避免这个问题吗?我知道我可以使用字符串而不是Func,并动态查找名称与字符串相同的函数,但我不想这样做
感谢您的帮助:)我认为这是不可能的,c#只允许您使用具有常量值的属性 一种方法是创建一个类而不是func,然后将该类的类型传递到属性中。 然后需要用反射实例化它,并在其中执行一个方法 例如:
public interface IDoStuff
{
IList<string> Execute();
}
然后,您将创建一个实现接口的类,并将其传递到属性中。尽管这意味着(至少在一开始,在不知道问题的情况下),每次您想要返回不同的结果时,都需要创建一个新类 来自C#规范:
17.1.3属性参数类型
属性类的位置参数和命名参数的类型仅限于属性参数类型,即:
·以下类型之一:bool、byte、char、double、float、int、long、sbyte、short、string、uint、ulong、ushort
·类型对象
·类型System.type
·枚举类型,前提是它具有公共可访问性,并且嵌套它的类型(如果有)也具有公共可访问性(§17.2)
·上述类型的一维数组
它可能看起来不漂亮,但您经常会发现字符串作为属性的参数,因为这些值必须在编译时已知。
public interface IDoStuff
{
IList<string> Execute();
}
public OperationInfo(VisibilityType v, string title, Type type)
{
///...
}