如何实现以下类型的事情?
dynamic prod = vid.HasValue ?
CatalogRepository.GetProductDetailByProductId(pid.Value, vid)
: CatalogRepository.GetProductDetailByProductId(pid.Value);
GetProductDetailByProductId(pid.Value)
返回Product
的对象,而GetProductDetailByProductId(pid.Value, vid)
返回ProductVariant
的对象。
我将对象分配给动态变量,因此应该在运行时识别它,但它在编译时给出了类型转换错误。
答案 0 :(得分:6)
我猜你有类型CastException的错误。
将您的第一个项目转换为Object,它应该编译:
dynamic prod = vid.HasValue ?
(dynamic)CatalogRepository.GetProductDetailByProductId(pid.Value, vid) :
CatalogRepository.GetProductDetailByProductId(pid.Value);
出现问题是因为当您使用条件运算符时,编译器会查看第一个类型以确定整个返回的类型,并可能在对象之间应用隐式转换。
var s = true ? "s" : 1 // doesn't compile, no implicit conversion between string and int
var f = true ? 2.0F : 1 // compile, implicit conversion exist between float and int
答案 1 :(得分:3)
我认为你不能。
first_expression和second_expression的类型必须是 相同,或者从一种类型到另一种类型的隐式转换必须存在
看起来Product
和ProductVariant
之间没有隐式转化,所以..
答案 2 :(得分:2)
您可以尝试:
dynamic prod;
if(vid.HasValue)
prod = CatalogRepository.GetProductDetailByProductId(pid.Value, vid);
else
prod = CatalogRepository.GetProductDetailByProductId(pid.Value);
或者替代地(如果该函数具有简单的可选默认值。)
dynamic prod = CatalogRepository.GetProductDetailByProductId(pid.Value, vid??null);
答案 3 :(得分:0)
我建议使用某种联合类型,而不是使用dynamic:
public class Union<T1, T2>
{
private readonly T1 _value1;
private readonly T2 _value2;
public Union(T1 value)
{
_value1 = value;
}
public Union(T2 value)
{
_value2 = value;
}
public T1 Case1
{
get { return _value1; }
}
public T2 Case2
{
get { return _value2; }
}
}
var prod = vid.HasValue ?
new Union<ProductVariant, Product>(CatalogRepository.GetProductDetailByProductId(pid.Value, vid)) :
new Union<ProductVariant, Product>(CatalogRepository.GetProductDetailByProductId(pid.Value));
(为了简洁,我保留了Union类型的定义,但理想情况下它可以指示设置了哪个变体,处理读取的错误变体等。)