反思中的隐式类型转换

时间:2010-05-11 03:26:13

标签: c# casting

所以我编写了一些代码来帮助快速转换业务对象和视图模型。不是为了我自己的博客,而是you can find the details here,如果你有兴趣或需要知道。

我遇到的一个问题是我有一个自定义集合类型,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();
}

但是,它仍然会因同一个强制转换异常而失败。我想知道它是否与反思有关?如果是这样,我能在这做什么吗?我也对建筑解决方案持开放态度!

1 个答案:

答案 0 :(得分:3)

首先,implicit运算符允许 implcit 转换(无转换指令)。 explicit运营商使用演员表。

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

例如:

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
}

在不知道你在做什么以及你是如何做的情况下,我无法提供有意义的替代方案。但是有些想法:

  1. 在您的实体上覆盖ToString(或使用您自己的版本的公共基类/接口,如果您不想使用ToString),则通常枚举这些集合以构建你的字符串数组
  2. 在您的集合上提供ToStringArray函数(通过公共基类或接口)执行类似的操作
  3. 最重要的一点是为此目的使用运营商;他们不会帮助你。