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

デリゲートを引数として属性に渡すことはできません。サポートされているタイプは次のとおりです。

  1. 物体
  2. タイプ
  3. 列挙型
  4. 単一次元配列
  5. bool、byte、float char、double、int、long、string...など。

ただし、Typeと文字列をサポートしているため、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);
    }
}

そして今、あなたはそれを次のように使うことができます:

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

これがお役に立てば幸いです。

于 2012-10-13T20:57:45.673 に答える
0

TypeConverterクラスの検索

また

タイプコンバータの例

この例は、AuthorConverterという名前の型コンバーターを作成する方法を示しています。AuthorConverterの例は、AuthorオブジェクトをStringに変換し、String表現をAuthorオブジェクトに変換します。


更新:@abhishekが示したような属性の制限をスキップできます。

考えられる別の方法は、「設定より規約」を定義することです。コンバーター関数は、同じクラス内で定義されたprivate static Converter(string val)のように定義されたメソッドです。あなたの場合:

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

カスタムコンバーター関数が存在することを示すために、プロパティの上にParameterConverterAttributeを配置できますが、必須ではありません。

于 2012-10-13T20:33:26.313 に答える