是否可以转换泛型类型,以便您可以使用来自方法的约束来调用泛型类型的方法,而不会使用相同的约束。 (根据以下代码)
private static void CheckThenCall<T>()
{
if(typeof(IHaveInterface).IsAssignableFrom(T))
{
Call<T>();
}
}
private static void Call<T>() where T : IHaveInterface
{
var typeOf = typeof(T);
}
答案 0 :(得分:0)
在编译时检查通用约束,因此运行时已经太晚了!所以简而言之,没有
答案 1 :(得分:0)
大概你会想要使用T类型的对象,而不仅仅是类型本身?
如果是这样,那么使用as operator,is operator和GetType就可以了。所有这些都在运行时使用对象的实际类型工作。
不幸的是is
和as
不适用于值类型,因此您只需将T限制为类。
private static void CheckThenCall<T>(T param) where T : class
{
if (param is IHaveInterface)
{
Call(param as IHaveInterface);
}
}
private static void Call<T>(T param) where T : IHaveInterface
{
Type typeOf = param.GetType();
}
答案 2 :(得分:0)
你不能,因为它在编译时被检查过。但是,您可以稍微修改您的代码以使其成为可能。我们假设我们有两个接口:
interface IFoo1 { }
interface IFoo2 { }
你有两种带约束的通用方法:
static void Foo1<T>() where T : IFoo1
{
var t = typeof(T);
}
static void Foo2<T>() where T : IFoo2
{
var t = typeof(T);
}
我100%确定你关心Foo1和Foo2中的typeof(T)
,因为除了这两个之外没有什么重要的。你有另一个没有约束的通用方法:
static void Foo<T>(T instance)
{
if (instance is IFoo1)
{
Foo1<T>(); //compile error!
}
}
如果您传递实例,事情会更容易:
static void Foo<T>(T instance)
{
if (instance is IFoo1)
{
Foo1(instance as IFoo1);
}
}
static void Foo1<T>(T instance) where T : IFoo1
{
var t = instance.GetType();
}
static void Foo2<T>(T instance) where T : IFoo2
{
var t = instance.GetType();
}