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

本文关键字:SomeClass typeof 函数 C#- | 更新日期: 2023-09-27 18:00:07

我已经实现了一个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不支持使用Generics。

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

不能将类型用作变量。一般来说,您可以使用泛型来摆脱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
没有其他办法。

您不能这样做。除非使用泛型或typeof,否则类型不能作为参数传递。Daniel Hilgarth的解决方案很好,但如果您的类打算用作属性,则不会起作用,因为c#不允许使用泛型属性。