C# - 将SomeClass传递给函数而不是typeof(SomeClass)

时间:2013-02-18 09:47:40

标签: c# constructor typeof

我实施了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未定义。


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

2 个答案:

答案 0 :(得分: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 没有其他办法。

答案 1 :(得分:1)

你做不到。除非使用泛型或typeof,否则不能将类型作为参数传递。 Daniel Hilgarth的解决方案非常棒,但如果您的类要用作属性,则无法使用,因为c#不允许使用泛型属性。