4

如何实现以下类型的事情?

dynamic prod = vid.HasValue ? 
              CatalogRepository.GetProductDetailByProductId(pid.Value, vid)
            : CatalogRepository.GetProductDetailByProductId(pid.Value);

GetProductDetailByProductId(pid.Value)返回一个对象,ProductGetProductDetailByProductId(pid.Value, vid)返回一个对象ProductVariant

我将对象分配给一个动态变量,因此它应该在运行时被识别,但它在编译时给我类型转换错误。

4

4 回答 4

6

我猜你有一个 CastException 类型的错误。

将您的第一项转换为对象,它应该编译:

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
于 2013-10-29T09:14:58.787 回答
3

我认为你不能。

因为从?: Operator (C# Reference)

first_expression 和 second_expression 的类型必须相同,或者必须存在从一种类型到另一种类型的隐式转换

看起来你的and之间没有隐式转换,所以..ProductProductVariant

于 2013-10-29T09:16:45.297 回答
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);
于 2013-10-29T09:19:18.143 回答
0

我建议为此使用某种联合类型,而不是使用动态:

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 类型的简短定义,但理想情况下,它能够指示设置了哪个变体,处理读取的错误变体等)。

于 2013-10-29T09:31:30.237 回答