使用来自没有约束的方法的约束来调用泛型方法

时间:2016-06-08 07:53:12

标签: c# generics

是否可以转换泛型类型,以便您可以使用来自方法的约束来调用泛型类型的方法,而不会使用相同的约束。 (根据以下代码)

private static void CheckThenCall<T>()
{
    if(typeof(IHaveInterface).IsAssignableFrom(T))
    {
        Call<T>();
    }
}
private static void Call<T>() where T : IHaveInterface
{
    var typeOf = typeof(T);
}

3 个答案:

答案 0 :(得分:0)

在编译时检查通用约束,因此运行时已经太晚了!所以简而言之,没有

答案 1 :(得分:0)

大概你会想要使用T类型的对象,而不仅仅是类型本身?

如果是这样,那么使用as operatoris operatorGetType就可以了。所有这些都在运行时使用对象的实际类型工作。

不幸的是isas不适用于值类型,因此您只需将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();
}