繁体   English   中英

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

[英]C# generic return with generic type set in the method not in the call

我正在尝试建立一种从数据库中检索数据的方法,并根据其中的数据来创建具有通用组件的类并将其合并。

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

var myObject = MyMethod();

当然,电话抱怨它不能从用法中推断类型。 我了解编译器错误消息,但是我不确定该怎么做。

它无法完成,但是……让我们暂时考虑一下,我们可以为下面的语句找到所需的编译方式:

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 1”。 但是如果没有一个好的, 最小的完整的代码示例 ,就不可能对这种可能性进行更彻底的评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM