3

我已经实现了ActionFilterAttribute映射SomeClassSomeOtherClass. 这是构造函数:

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 会假装typeFrom并且typeTo未定义。


编辑: s 不支持泛型的使用(否则显然是正确的,如下所述)Attribute

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 回答