在方法中途添加通用类型约束

时间:2018-07-18 03:48:38

标签: c# generics

我有两种通用方法-

public CustomObject<T> MethodA<T>(T arg1) where T : class
{
    ...
    return MethodB<T>(arg1);
}


public CustomObject<R> MethodB<R>(R arg2) where R : class, IInterface
{
    ...
    return new CustomObject<R>();
}

问题显然是我无法使用没有实现MethodB的类型(T没有实现)来调用IInterface。但是,如果我这样做了-

public CustomObject<T> MethodA(T arg1) where T : class
{
    ...
    var casted = arg1 as IInterface;
    if (casted != null)
    {
        return MethodB<T>(casted);
    }
}

显然这不能编译,但是应该编译吗?如何让编译器知道我知道casted实现了IInterface并且是一个类,所以对MethodB的调用是可以的?这里最大的麻烦可能是我想返回CustomObject<T>

2 个答案:

答案 0 :(得分:3)

您需要使用反射功能来完成这项工作。

尝试一下:

public CustomObject<T> MethodA<T>(T arg1) where T : class
{
    if (arg1 is IInterface)
    {
        var method = this.GetType().GetMethod("MethodB").MakeGenericMethod(arg1.GetType());
        return (CustomObject<T>)method.Invoke(this, new [] { arg1 });
    }
    return null;
}

答案 1 :(得分:-1)

由于您的CustomObject<T>是通用名称,因此存在问题。例如,CustomObject<object>CustomObject<string>不可互换,但是您可以在两者之间进行转换。

您可以作为解决方法:

public class CustomObject<T> where T : class {}
public interface IInterface { }

public static class CustomObjectConverter
{
    public static CustomObject<T1> ConvertTo<T1, T2>(CustomObject<T2> other)
        where T1 : class
        where T2 : class
    {
        return new CustomObject<T1>();
    }
}

public CustomObject<T> MethodA<T>(T arg1) where T : class
{
    if (arg1 is IInterface inf)
    {
        var b = MethodB(inf);
        return CustomObjectConverter.ConvertTo<T,IInterface>(b);
    }
    return null;
}
public CustomObject<T> MethodB<T>(T arg2) where T : class, IInterface
{
    return new CustomObject<T>();
}