C# 反射中的隐式类型转换
因此,我已经编写了一些代码来帮助在业务对象和视图模型之间快速转换。不是拉我自己的博客,但如果你有兴趣或需要知道 我遇到的一个问题是,我有一个自定义集合类型ProductCollection,我需要在我的模型中将其转换为字符串[]。显然,由于没有默认的隐式强制转换,我的契约转换器中出现了一个异常 因此,我想我将编写下一段代码,这将解决问题:C# 反射中的隐式类型转换,c#,casting,C#,Casting,因此,我已经编写了一些代码来帮助在业务对象和视图模型之间快速转换。不是拉我自己的博客,但如果你有兴趣或需要知道 我遇到的一个问题是,我有一个自定义集合类型ProductCollection,我需要在我的模型中将其转换为字符串[]。显然,由于没有默认的隐式强制转换,我的契约转换器中出现了一个异常 因此,我想我将编写下一段代码,这将解决问题: public static implicit operator string[](ProductCollection collection) { va
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()将结束整个世界。这是一个非常好的解释。谢谢这是一种晦涩难懂的语言,在寻找解决方案之前我并不知道。