C# 泛型返回,泛型类型在方法中设置,而不是在调用中

本文关键字:调用 设置 方法 泛型 返回 泛型类型 | 更新日期: 2023-09-27 17:56:08

我正在尝试设置一个从数据库中检索数据的方法,并根据其中的数据创建并水合一个具有通用组件的类。

public class MyObject<T> where T : BaseMyType 
{
    T MyTypedObject { get; set; }
}
public class MyType1 : BaseMyType 
{
    string Key { get; set; }
}
public class MyType2 : BaseMyType 
{
    Guid Id { get; set; }
}
public MyObject<T> MyMethod<T>() where T : BaseMyType
{
    if(Situation1)
        return new MyObject(MyType1);
    else
        return new MyObject(MyType2);
}

此代码抱怨 MyObject 无法转换为 MyObject。 现在我需要像这样使用它:

var myObject = MyMethod();

当然,调用抱怨它无法从用法中推断出类型。 我了解编译器错误消息,我只是不确定如何做我需要的。

C# 泛型返回,泛型类型在方法中设置,而不是在调用中

这不可能做到,但是......让我们假设一下,我们可以找出一种方法,让以下语句以您想要的方式编译:

var myObject = MyMethod();

那么使用myObject的代码会是什么样子呢?在此假设方案中,变量 myObject 有时具有 MyType1 类型,有时具有 MyType2 类型。使用myObject的代码会关心这一点吗?

如果该代码将执行的所有操作是使用共享基类型的成员(即 BaseMyType ),那么修复很容易。忘记通用方法:

public BaseMyType MyMethod()
{
    if(Situation1)
        return new MyType1();
    else
        return new MyType2();
}

如果它确实关心差异(即需要访问KeyId,具体取决于返回的类型),那么即使你可以做不可能的事情,调用代码仍然需要根据Situation1变量有条件地处理各个场景。这意味着您将Situation1的支票放在错误的位置。

相反,您的呼叫者应该看起来更像这样:

if (Situation1)
{
    MyType1 myObject = MyMethod1();
    // do situation 1 stuff
}
else
{
    MyType2 myObject = MyMethod2();
    // do situation 2 stuff
}

其中原始MyMethod()的实现已拆分为两种方法, MyMethod1()MyMethod2() ,对应于两种场景。同样,请注意,作为实现的一部分,完全没有泛型。它不是必需的,也不会起作用。

甚至有可能你需要调用方的多态实现,即你不必多次检查Situation1。但是,如果没有一个好的、最小的完整的代码示例,就不可能更彻底地评论这种可能性。