C# 反射中的隐式类型转换

C# 反射中的隐式类型转换,c#,casting,C#,Casting,因此,我已经编写了一些代码来帮助在业务对象和视图模型之间快速转换。不是拉我自己的博客,但如果你有兴趣或需要知道 我遇到的一个问题是,我有一个自定义集合类型ProductCollection,我需要在我的模型中将其转换为字符串[]。显然,由于没有默认的隐式强制转换,我的契约转换器中出现了一个异常 因此,我想我将编写下一段代码,这将解决问题: public static implicit operator string[](ProductCollection collection) { va

因此,我已经编写了一些代码来帮助在业务对象和视图模型之间快速转换。不是拉我自己的博客,但如果你有兴趣或需要知道

我遇到的一个问题是,我有一个自定义集合类型ProductCollection,我需要在我的模型中将其转换为字符串[]。显然,由于没有默认的隐式强制转换,我的契约转换器中出现了一个异常

因此,我想我将编写下一段代码,这将解决问题:

public static implicit operator string[](ProductCollection collection) {
    var list = new List<string>();
    foreach (var product in collection)
    {
        if (product.Id == null)
        {
            list.Add(null);
        }
        else
        {
            list.Add(product.Id.ToString());
        }
    }
    return list.ToArray();
}
公共静态隐式运算符字符串[](ProductCollection){
var list=新列表();
foreach(集合中的var产品)
{
if(product.Id==null)
{
list.Add(空);
}
其他的
{
list.Add(product.Id.ToString());
}
}
return list.ToArray();
}

但是,它仍然会失败,并出现相同的强制转换异常。我想知道这是否与沉思有关?如果是的话,我能在这里做些什么吗??我也对架构解决方案持开放态度

首先,
implicit
运算符允许implcit转换(无强制转换指令)<代码>显式运算符对强制转换进行操作

尽管如此,这并不是真正的问题。运算符不是多态的(它们是重载的,而不是重写的);也就是说,为了利用重载运算符,必须在定义它的类的上下文中引用该类

例如:

public class Foo
{
    public static implicit operator Bar(Foo foo) { return new Bar(); }
}

public class Bar { }

...

void Baz()
{
    Foo foo = new Foo();

    Bar bar = foo; // OK

    object baz = foo;

    bar = baz; // won't compile, there's no defined operator at the object level

    bar = (Bar)baz; // will compile, but will fail at runtime for the same reason
}
如果不知道你在做什么以及你是如何做的,我就不能提供很多有意义的替代方案。然而,有些想法:

  • 重写实体上的
    ToString
    (如果您不想使用
    ToString
    ,请使用您自己版本的实体的公共基类/接口),然后一般性地枚举集合以构造字符串数组
  • 在集合上提供一个执行类似操作的
    tostringray
    函数(通过公共基类或接口)

  • 最大的一点是不要为此目的使用运营商;它们对您没有帮助。

    将空字符串添加到您正在生成的列表中,您希望获得什么内在价值?只是想知道。您说了
    强制转换异常
    ,但声明了一个
    隐式
    运算符。您的意思是声明一个显式运算符吗?将代码发布到您希望触发它的地方。Nathan Taylor,如果product.Id为null,则其上的ToString()将结束整个世界。这是一个非常好的解释。谢谢这是一种晦涩难懂的语言,在寻找解决方案之前我并不知道。