编程语言
首页 > 编程语言> > c#-反射中的隐式类型转换

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