如何在.Net中实现"使用此函数转换"自定义属性?

Ear*_*rlz 3 .net c# reflection delegates custom-attributes

我正在使用Attributes构建一些东西.我真的想要作为属性实现的一件事是convert a string to this property's type using this function.现在,我有这个:

    public delegate object ParameterConverter(string val);

    [AttributeUsage(AttributeTargets.Property)]
    public class ParameterConverterAttribute : ParameterBaseAttribute
    {
        ParameterConverter Converter;
        public ParameterConverterAttribute(ParameterConverter converter)
        {
            Converter=converter;
        }
        public object Convert(string val)
        {
            return Converter(val);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我这样使用它:

public class Tester
{
    [ParameterConverter(new ParameterConverter(TestConverter)] //error here
    public int Foo{get;set;}
    static object TestConverter(string val)
    {
      return 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,.Net或至少C#似乎不支持这种事情.似乎属性内的委托不起作用.

是否有解决此问题的方法或处理此问题的好方法?

abh*_*hek 5

No Delegates不能作为参数传递给Attribute.支持的类型是:

  1. 宾语
  2. 类型
  3. 枚举
  4. 单维数组
  5. bool,byte,float char,double,int,long,string ....等

但是由于它支持Type和string,您可以传递Type和方法的名称以在Attribute类中创建委托.

public delegate object ParameterConverter(string val);

[AttributeUsage(AttributeTargets.Property)]
public class ParameterConverterAttribute : ParameterBaseAttribute
{
    public ParameterConverter Converter { get; set; }
    public ParameterConverterAttribute(Type delegateType, string method)
    {
     try{ // Important as GetMethod can throw error exception or return null
        this.Converter = (ParameterConverter)Delegate.CreateDelegate(delegateType, delegateType.GetMethod(method));
      }
      catch { } 
    }
    public object Convert(string val)
    {
        if(this.Converter != null)
             return Converter(val);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以使用它:

public class Tester
{
    [ParameterConverter(typeof(ParameterConverter), "TestConverter"] 
    public int Foo{get;set;}
    static object TestConverter(string val)
    {
      return 10;
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这会对你有所帮助.