我想创建一个将类型作为参数的方法。这种类型必须实现一个接口。
我知道我可以做这样的事
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
}
这是无效的语法,但是我可以使用吗?
答案 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();