假设我有
public class ClassA : Ione, Itwo
public class ClassB : Ione, Itwo
public class ClassC : Ione, Itwo
和方法MethodA,它返回ClassA,ClassB或ClassC的实例。 MethodA返回类型可以是Ione或Itwo。
我怎样才能实现这一目标?。
我尝试过使用这样的泛型:
public T MethodA<T>(myEnum e) where T : Ione, Itwo
但是在输入return (T)new ClassA();
时,我收到错误“无法将类型ClassA转换为T”。
感谢。
答案 0 :(得分:5)
统一两个接口:
interface ITogether : Ione, Itwo { }
并将其用作返回类型。
你可能需要你的课程来实现ITogether而不是Ione和Itwo,但是你应该尝试两种方式。
答案 1 :(得分:3)
您可以定义一个继承自IThree
,Ione
的新接口Itwo
,然后在您的具体类中实现该接口:
public interface IThree : Ione, Itwo { }
然后将其用作返回类型:
public IThree MethodA<T>(myEnum e) where T : IThree
{
return new ClassA();
}
要使此方法通用,您可以添加new()
约束并返回所需的类型
public static T MethodOfType<T>() where T : IThree, new()
{
return new T();
}
答案 2 :(得分:0)
首先将ClassA作为对象
public T MethodA<T>() where T : Ione, Itwo
{
return (T)(object)new ClassA();
}
应该可以工作,但可以抛出运行时异常。您可能想要的是
public T MethodA<T>() where T : Ione, Itwo
{
return (T)(object)Activator.CreateInstance(typeof(T));
}
另请注意,如果T没有空构造函数,这仍会导致异常。你可以通过添加更新声明来添加编译时检查T:Ione,Itwo,new()