2016-08-05 14 views
0

のインタフェースにキャストするとアンボクシングジェネリック医薬品は、私はその問題の一部を回避することができますどのように怒鳴るボクシングと

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 
    } 
} 

のようなコードを持っています。ジェネリッククラスをアンボックスするのに似たようなものを作ってください。ただし、インターフェイスのようなもっと一般的なものにしてください。

ジェネリックスに基づいてデータソースを構築したコンボボックスがあるので、これが必要です。そして、私はそのリストにある項目を、一般的な値のいくつかのプロパティを使って見つける必要があります。

+0

あなたはSomeDtoでFIKは今IFooのインターフェイスであることを期待していますか?あなたはそれをすることはできません。 – Dispersia

+0

ちょうどあなたに知らせるために - ボクシングとボクシングという用語はまったく別物を指しています。 – Stilgar

答えて

-1

簡単な答えは、汎用インターフェースを使用する必要があるということです。以下は例です。ここでは一般的なインタフェースのためのMSDNのリンクです:https://msdn.microsoft.com/en-us/library/kwtft8ak.aspx?f=255&MSPPError=-2147217396

public interface IFoo<T> 
{ 
    int One { get; set; } 
    T mrT { get; set; } 
} 

public class DejaFoo<T> : IFoo<T> 
{ 
    public int One { get; set; } 
    public T mrT { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var FooFoo = new DejaFoo<string>() { One = 1, mrT = "B. A. Baracus" }; 
     var boxed = (object) FooFoo; 

     var unboxed1 = (DejaFoo<string>) boxed; 
     Console.Write(unboxed1.mrT); 

     var unboxed2 = boxed as DejaFoo<string>; 
     Console.WriteLine(" is #{0}", unboxed2.One); 
    } 
} 

上記のコードを出力すべき:

B. A. Baracus is #1 
+0

あなたのコードを読んで、型をオブジェクトに割り当てて、あまり意味と価値を持たない同じ型にキャストします。 –

+0

なぜIFooは突然一般的になりますか?それは必要ではありません。 –

3

1)ボクシング/アンボクシング

2については何もあなたがそれを行うことはできません)がありませんSomeDto<IFoo>SomeDto<Foo>はお互いに不変であるためです。つまり、「IFooFooから割り当て可能」であっても、「SomeDto<IFoo>SomeDto<Foo>から割り当て可能」とは言えません。逆も同様です。

あなたの意図に似ているものは、共変/反変一般的なインターフェイスを使用しています(デリゲートとインターフェイスだけがそのトリックをサポートするためです)。たとえば用

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<IFoo>IDto<Foo>を割り当てることができます。

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

この場合、共変ではなく、反変ではない。クラスは協調的でも反例的でもなく、インタフェースと代理人だけができるため、インタフェースが必要であることに言及する価値があります。 –

+0

@ThomasLevesque作者が何を必要としているか分からないので、それはほんの一例です。しかし、私の答えから分かりにくい場合は、インタフェースを使う必要性について言及します。ありがとう。 –

+0

ボクシングとunboxing事を理解している私の悪い私の間違いのため申し訳ありません。また、答えに感謝します。残念ながら、それはまだ私の問題を解決しません。私はその場所の正確な実装を知らなかったので、インタフェース(IFoo)のためにキャストしたかったのです。私はオブジェクトがすべてIFoo antのタイプであることを知っています。 IFooには複数の実装があります。最後に、私は私のコンボボックスのデータソースに置いたデータを変更することでその問題を解決しました。 すべてのお返事ありがとうございます。 – user3333010

関連する問題