如何根据某些条件创建对象

时间:2013-10-29 09:13:20

标签: c# asp.net asp.net-mvc-4

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

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

GetProductDetailByProductId(pid.Value)返回Product的对象,而GetProductDetailByProductId(pid.Value, vid)返回ProductVariant的对象。

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

4 个答案:

答案 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)

我认为你不能。

来自?: Operator (C# Reference)

  

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

看起来ProductProductVariant之间没有隐式转化,所以..

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

相关问题