C# 方法返回派生泛型类,而不指定返回的类型

C# 方法返回派生泛型类,而不指定返回的类型,c#,generics,inheritance,derived-class,C#,Generics,Inheritance,Derived Class,我有这样一个基类: public class BaseClass<T, R> : DbContext where T : class, IAPIObject<R> { public void MethodA() { Something using T Something using R } } public class DerivedClass1 : BaseClass<TypeA, TypeB> pu

我有这样一个基类:

public class BaseClass<T, R> : DbContext where T : class, IAPIObject<R>
{
    public void MethodA()
    {
        Something using T
        Something using R
    }
}
public class DerivedClass1 : BaseClass<TypeA, TypeB>
public class DerivedClass2 : BaseClass<TypeC, TypeD>
公共类基类:DbContext,其中T:class,IAPIObject
{
公开无效方法a()
{
使用T的东西
使用R的东西
}
}
我有一些类似这样的派生类:

public class BaseClass<T, R> : DbContext where T : class, IAPIObject<R>
{
    public void MethodA()
    {
        Something using T
        Something using R
    }
}
public class DerivedClass1 : BaseClass<TypeA, TypeB>
public class DerivedClass2 : BaseClass<TypeC, TypeD>
公共类DerivedClass1:基类
公共类派生类2:基类
我希望编写如下函数,而不指定返回对象的类型,因为它们是在派生类中定义的:

private BaseClass GetObject<T>(T apiObject)
{
    return apiObject switch
        {
            TypeA _ => DerivedClass1(),
            TypeC _ => DerivedClass2(),
        }
}
private基类GetObject(apitobject)
{
返回对象开关
{
TypeA=>DerivedClass1(),
TypeC=>DerivedClass2(),
}
}
这可能吗?这是个好主意吗?我觉得这是一个机会,这是完全错误的方式去设计这个东西,但我不是太有经验

最终目标是能够获得具有基于某个参数定义的类型的BaseClass实例,然后执行诸如BaseClass.MethodA()之类的操作,而不再担心指定类型:

var thing = GetObject<TypeA>(someObject);
thing.MethodA();
var thing=GetObject(someObject);
方法a();

如果我在方法本身上定义类型,那么每次调用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?
    };
接口类{
void MethodA();
}
//将返回类型更改为非泛型接口
私有IBaseClass GetObject(T apiObject)=>
apiObject开关
{
TypeA=>DerivedClass1(),
TypeC=>DerivedClass2(),
//你似乎错过了一个默认案例?
};
在这个非通用接口
IBaseClass
,您可以调用
MethodA


由于您对返回对象的
t
R
一无所知,因此不能使用涉及这些类型的
BaseClass
的任何成员
IBaseClass
您是否向编译器承诺“我不会使用任何涉及
t
R
的成员”

您可以让
GetObject
返回一个非泛型
IBaseClass
接口,该接口声明了
MethodA
方法<代码>基类将实现这个接口。抽象方法?这应该可以很好地工作-谢谢!感谢您对默认情况的评论-我只是没有将其包括在问题伪代码中,因为基类实际上继承自Microsoft.EntityFrameworkCore.DbContext,我将其设置为类而不是接口,但无论如何这都是可行的。