c#-反射中的隐式类型转换
作者:互联网
因此,我写了一些代码来帮助快速在业务对象和视图模型之间进行转换.如果您有兴趣或需要知道,请不要拉皮条我自己的博客,但是请拨you can find the details here.
我遇到的一个问题是,我有一个自定义的集合类型ProductCollection,我需要在模型中将其转变为string [] in.显然,由于没有默认的隐式强制转换,因此我的合同转换器中出现异常.
因此,我认为我将编写下一部分代码,这应该可以解决问题:
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();
}
但是,它仍然会因相同的强制转换异常而失败.我想知道这与反思有关吗?如果是这样,我在这里能做些什么?我也愿意接受建筑解决方案!
解决方法:
首先,隐式运算符允许进行隐式转换(无强制转换指令).显式运算符对演员进行操作.
尽管如此,这不是真正的问题.运算符不是多态的(它们是重载的,不会被覆盖);也就是说,为了利用重载的运算符,必须在定义它的类的上下文中引用一个类.
例如:
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,则对您的实体使用ToString(或为您的实体使用通用的基类/接口),然后以一般方式枚举集合以构造您的字符串数组
>在您的集合上提供ToStringArray函数(通过公共基类或接口),该函数执行类似的操作
最大的一点是不要为此目的使用运算符.他们不会帮助您.
标签:casting,c 来源: https://codeday.me/bug/20191210/2099000.html