2016-08-05 15 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

당신이 지금 IFoo의 인터페이스로 SomeDto에 FIK을 기대 :

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>을 할당 할 수 있습니다 : 예를를 들어 ? 너는 그렇게 할 수 없다. – Dispersia

+0

그냥 알려주세요 - 복싱과 언 박싱이라는 용어는 완전히 다른 것을 말합니다. – Stilgar

답변

-1

간단히 대답하면 일반 인터페이스를 사용해야한다는 것입니다. 아래는 그 예입니다. 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

을 개봉기) 당신은 그렇게 할 수 없습니다 여기에 일반 인터페이스에 대한 MSDN 링크입니다 SomeDto<IFoo>SomeDto<Foo>은 서로 불변이므로 즉, " IFooFoo에서 할당 가능"이라고해도 " SomeDto<IFoo>SomeDto<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

이 경우에는 공분산 (contovorant)이 아닙니다. 클래스가 공동 또는 반항이 될 수 없으며 인터페이스와 델리게이트 만이 할 수 있기 때문에 인터페이스가 필요하다는 것을 언급 할 가치가 있습니다. –

+0

@ThomasLevesque 작성자가 무엇을 필요로하는지 모르기 때문에 그 예일뿐입니다. 하지만 인터페이스를 사용하는 것이 필자의 대답에서 분명하지 않다면 필자는 언급 할 것이다. –

+0

내 나쁜 이해 권투와 unboxing 것은 내 실수로 죄송합니다. 또한 답변을 주셔서 감사합니다. 불행히도 그것은 여전히 ​​내 문제를 해결하지 못합니다. 그 곳에서 정확한 구현을 모르기 때문에 인터페이스 (IFoo)를 위해 캐스팅을하고 싶었습니다. 나는 그 물체가 모두 IFoo ant라는 것을 알고있다. IFoo는 둘 이상의 구현체를 가지고 있습니다. 마지막으로 나는 내 콤보 상자의 데이터 소스에 넣은 데이터를 변경하여이 문제를 해결했습니다. 모든 답변 주셔서 감사합니다. – user3333010