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

时间:2015-06-12 16:55:35

标签: c# generics

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

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&lt; MyType1&gt;无法转换为MyObject&lt; T&gt;。现在我需要像这样使用它:

var myObject = MyMethod();

当然,电话会抱怨它不能从使用中推断出类型。我理解编译器错误消息,我只是不确定如何做我需要的。

1 个答案:

答案 0 :(得分:1)

它无法完成,但是......让我们想一想,我们可以找到一种方法让下面的语句按照你想要的方式进行编译:

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。但如果没有a good, minimal, complete code example,就不可能更彻底地评论这种可能性。