方法 return 派生泛型 class 而不指定 return 的类型
Method to return derived generic class without specifying the types of the return
我有这样一个基础class:
public class BaseClass<T, R> : DbContext where T : class, IAPIObject<R>
{
public void MethodA()
{
Something using T
Something using R
}
}
我有一些派生的 class 是这样的:
public class DerivedClass1 : BaseClass<TypeA, TypeB>
public class DerivedClass2 : BaseClass<TypeC, TypeD>
我想编写一个如下所示的函数,而不指定返回对象的类型,因为它们是在派生的 classes:
中定义的
private BaseClass GetObject<T>(T apiObject)
{
return apiObject switch
{
TypeA _ => DerivedClass1(),
TypeC _ => DerivedClass2(),
}
}
这可能吗?这是一个好主意吗?我觉得这有可能是完全错误的设计方式,但我经验不足。
最终目标是能够获得具有基于某些参数定义的类型的 BaseClass 实例,然后执行 BaseClass.MethodA() 之类的操作,而不必再担心指定类型:
var thing = GetObject<TypeA>(someObject);
thing.MethodA();
如果我在方法本身上定义类型,那么我每次调用 MethodA() 时都必须定义它们,如果我知道 DerivedClass1 将始终使用 TypeA 和 TypeB,这会感觉多余。有没有更好的方法来使用虚拟方法并覆盖?
由于您尝试调用的方法的签名 (MethodA
) 不涉及类型参数(只有它的实现使用类型参数),您可以创建一个非泛型接口:
interface IBaseClass {
void MethodA();
}
// change the return type to the non-generic interface
private IBaseClass GetObject<T>(T apiObject) =>
apiObject switch
{
TypeA _ => DerivedClass1(),
TypeC _ => DerivedClass2(),
// you seem to be missing a default case?
};
在此非通用接口 IBaseClass
上,您可以调用 MethodA
!
由于您对返回对象的 T
和 R
一无所知,因此您不能使用涉及这些类型的 BaseClass
的任何成员。 IBaseClass
您是否向编译器承诺“我不会使用任何涉及 T
和 R
的成员”。
我有这样一个基础class:
public class BaseClass<T, R> : DbContext where T : class, IAPIObject<R>
{
public void MethodA()
{
Something using T
Something using R
}
}
我有一些派生的 class 是这样的:
public class DerivedClass1 : BaseClass<TypeA, TypeB>
public class DerivedClass2 : BaseClass<TypeC, TypeD>
我想编写一个如下所示的函数,而不指定返回对象的类型,因为它们是在派生的 classes:
中定义的private BaseClass GetObject<T>(T apiObject)
{
return apiObject switch
{
TypeA _ => DerivedClass1(),
TypeC _ => DerivedClass2(),
}
}
这可能吗?这是一个好主意吗?我觉得这有可能是完全错误的设计方式,但我经验不足。
最终目标是能够获得具有基于某些参数定义的类型的 BaseClass 实例,然后执行 BaseClass.MethodA() 之类的操作,而不必再担心指定类型:
var thing = GetObject<TypeA>(someObject);
thing.MethodA();
如果我在方法本身上定义类型,那么我每次调用 MethodA() 时都必须定义它们,如果我知道 DerivedClass1 将始终使用 TypeA 和 TypeB,这会感觉多余。有没有更好的方法来使用虚拟方法并覆盖?
由于您尝试调用的方法的签名 (MethodA
) 不涉及类型参数(只有它的实现使用类型参数),您可以创建一个非泛型接口:
interface IBaseClass {
void MethodA();
}
// change the return type to the non-generic interface
private IBaseClass GetObject<T>(T apiObject) =>
apiObject switch
{
TypeA _ => DerivedClass1(),
TypeC _ => DerivedClass2(),
// you seem to be missing a default case?
};
在此非通用接口 IBaseClass
上,您可以调用 MethodA
!
由于您对返回对象的 T
和 R
一无所知,因此您不能使用涉及这些类型的 BaseClass
的任何成员。 IBaseClass
您是否向编译器承诺“我不会使用任何涉及 T
和 R
的成员”。