我正在尝试设置一个从数据库中检索数据的方法,并根据其中的数据创建并使用通用组件创建一个类。
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();
当然,电话会抱怨它不能从使用中推断出类型。我理解编译器错误消息,我只是不确定如何做我需要的。
答案 0 :(得分:1)
它无法完成,但是......让我们想一想,我们可以找到一种方法让下面的语句按照你想要的方式进行编译:
var myObject = MyMethod();
然后使用myObject
的代码是什么样的?在此假设方案中,变量myObject
有时会具有MyType1
类型,有时类型为MyType2
。使用myObject
的代码会关心这个吗?
如果所有代码都使用共享基本类型的成员(即BaseMyType
),则修复很容易。忘记通用方法:
public BaseMyType MyMethod()
{
if(Situation1)
return new MyType1();
else
return new MyType2();
}
如果确实关心差异(即根据返回的类型需要访问Key
或Id
),那么即使你可以做到不可能,调用代码仍然需要根据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,就不可能更彻底地评论这种可能性。