Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Func放在C#属性(注释)中?_C#_Reflection_Attributes - Fatal编程技术网

如何将Func放在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

我有一个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;
    }
}
[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)
{
   ///...
}