所以我编写了一些代码来帮助快速转换业务对象和视图模型。不是为了我自己的博客,而是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();
}
但是,它仍然会因同一个强制转换异常而失败。我想知道它是否与反思有关?如果是这样,我能在这做什么吗?我也对建筑解决方案持开放态度!
答案 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
}
在不知道你在做什么以及你是如何做的情况下,我无法提供有意义的替代方案。但是有些想法:
ToString
(或使用您自己的版本的公共基类/接口,如果您不想使用ToString
),则通常枚举这些集合以构建你的字符串数组ToStringArray
函数(通过公共基类或接口)执行类似的操作最重要的一点是不为此目的使用运营商;他们不会帮助你。