我有两种通用方法-
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>
。
答案 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>();
}