3

我正在使用属性构建一些东西。我真正想作为属性实现的一件事是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);
        }
    }

我像这样使用它:

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

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

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

4

2 回答 2

5

No Delegates cannot be passed as an argument to an Attribute. The Supported types are :

  1. Object
  2. Type
  3. Enum
  4. Single Dimentional Array
  5. bool, byte, float char, double, int, long, string .... etc.

But as it supports Type as well as strings, you can pass a Type and the name of the method to create a delegate inside the Attribute class.

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);
    }
}

And now you can use it like :

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

I hope this would help you.

于 2012-10-13T20:57:45.673 回答
0

查找TypeConverter 类

或者

类型转换器示例

此示例说明如何创建名为 AuthorConverter....的类型转换器。AuthorConverter 示例将 Author 对象转换为 String 并将 String 表示形式转换为 Author 对象。


更新:您可以跳过@abhishek 所显示的属性限制。

可能的另一种方法是定义一些“约定优于配置”:转换器函数是一种定义的方法,就像在同一类中定义的私有静态转换器(字符串 val)一样。在你的情况下:

public class Tester
{
    public int Foo{get;set;}
    private static int FooConverter(string val)
    {
      return 10;
    }
}

您可以在属性顶部放置一些 ParameterConverterAttribute 作为自定义转换器功能存在的标志,但不是强制性的。

于 2012-10-13T20:33:26.313 回答