3

ActionFilterAttributeにマップSomeClassする を実装しましたSomeOtherClass。コンストラクタは次のとおりです。

public class MapToAttribute : ActionFilterAttribute
{
    private Type _typeFrom;
    private Type _typeTo;
    public int Position { get; set; }

    public MapToAttribute(Type typeFrom, Type typeTo, int Position = 0)
    {
        this.Position = Position;
        this._typeFrom = typeFrom;
        this._typeTo = typeTo;
    }

    ...
}

現在、これを呼び出す方法は次のとおりです。

MapTo(typeof(List<Customer>), typeof(List<CustomerMapper>), 999)

審美的な理由から、私はできることを好む

MapTo(List<Customer>, List<CustomerMapper>, 999)

やってみました

    public MapToAttribute(object typeFrom, object typeTo, int Position = 0)
    {
        this.Position = Position;
        this._typeFrom = typeof(typeFrom);
        this._typeTo = typeof(typeTo);
    }

しかし、Visual Studio はそのふりをtypeFromtypeToて未定義であるため、役に立ちません。


編集: (以下で指摘されているように、それ以外の場合は明らかに適切です) Generics の使用はAttributes ではサポートされていません。

4

2 に答える 2

2

型を変数として使用することはできません。一般に、ジェネリックを使用して次のものを取り除くことができますtypeof

public class MapToAttribute<TFrom, TTo> : ActionFilterAttribute
{
    private Type _typeFrom;
    private Type _typeTo;
    public int Position { get; set; }

    public MapToAttribute(int Position = 0)
    {
        this.Position = Position;
        this._typeFrom = typeof(TFrom);
        this._typeTo = typeof(TTo);
    }

    ...
}

使用法:

new MapToAttribute<List<Customer>, List<CustomerMapper>>(999);

問題:
C# ではジェネリック属性が許可されていないため、typeof.
他に方法はありません。

于 2013-02-18T09:49:57.750 に答える
1

それをしてはいけない。ジェネリックまたは typeof を使用しない限り、型をパラメーターとして渡すことはできません。Daniel Hilgarth のソリューションは優れていますが、c# ではジェネリック属性が許可されていないため、クラスを属性として使用することを意図している場合は機能しません。

于 2013-02-18T09:55:31.330 に答える