拳击和拆箱通用与铸造接口

时间:2016-08-05 22:37:21

标签: c# generics casting boxing unboxing

我的代码类似于bellow

public interface IFoo
{
    int One { get; set; }

    string Two { get; set; }
}

public class Foo : IFoo
{
    public int One { get; set; }
    public string Two { get; set; }
}

public class SomeDto<T>
    where T : IFoo
{
    public T Fik { get; set; }

    public string Faj { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var fik = new SomeDto<Foo>() { Fik = new Foo() { One = 1, Two = "ss" }, Faj = "ss" };

        var obj = (Object)fik;

        // the problematic part 
        //=======================
        var fikl = fik as SomeDto<IFoo>;  //do something like that 
                                          //or
        var fikl = (SomeDto<IFoo>)fik;   //do something like that 
    }
}

我如何解决这个有问题的部分。做一些类似的东西,允许拆箱一般的类,但更像一般的接口。

我需要这个,因为我有一个基于泛型的数据源构建的组合框。我需要在列表中找到项目,使用某些属性形成通用值。

1 个答案:

答案 0 :(得分:3)

1)没有关于装箱/拆箱的内容

2)您无法做到这一点,因为SomeDto<IFoo>SomeDto<Foo>彼此不变。这意味着即使&#34; IFoo可以从Foo&#34;你不能说&#34; SomeDto<IFoo>可以从SomeDto<Foo>&#34;反之亦然。

与您的意图类似的是使用协变/逆变通用接口(因为只有委托和接口支持该技巧)。 例如

    interface IFoo
    {
        int Int { get; set; } 
    }

    class Foo : IFoo
    {
        public int Int { get; set; }
    }

    interface IDto<out T> where T : IFoo
    {
        T Obj { get; }
    }

    class Dto<T> : IDto<T> where T : IFoo
    {
        public T Obj { get; set; }
    }

因此您可以将IDto<Foo>分配给IDto<IFoo>

    static void Main(string[] args)
    {
        Foo foo = new Foo();
        IDto<IFoo> dto = new Dto<IFoo>() {Obj = foo};
        object obj = dto;
        dto = (IDto<Foo>) obj;
    }