传入类型作为实现接口的参数

时间:2019-01-08 19:45:31

标签: c#

我想创建一个将类型作为参数的方法。这种类型必须实现一个接口。

我知道我可以做这样的事

    public void FooBar<T>(T item) where T : MyInterface
    {
        // do something with typeof(T)
    }

但是我想要类似的东西

    public void FooBar(Type desiredType) where desiredType : MyInterface
    {
        // do something with desiredType
    }

这是无效的语法,但是我可以使用吗?

2 个答案:

答案 0 :(得分:2)

简单地写

public void FooBar(MyInterface item)
{
    ...
}

这允许您传递实现接口的任何类型。

这是您可以动态执行的最佳操作。我什至怀疑您是否根本需要通用版本。如果您有类似public T FooBar(T item)的名称,那么可以使用通用版本,但是在这里,您可以简单地使用派生或实现类型的赋值兼容性。


如果需要运行时类型为item,则可以编写。

Type type = item?.GetType();
if (type != null) {
    ...
}

if (item != null) {
    Type type = item.GetType();
}

答案 1 :(得分:1)

不,您无法做您想达到的目标。但是您可以使用反射来检查它并引发异常。但是,这将是运行时检查,而不是编译器时间检查。

if (typeof(IMyInterface).IsAssignableFrom(myType)
    throw new ArgumentException();

if (myType.GetInterfaces().Contains(typeof(IMyInterface)))
    throw new ArgumentException();