2010-03-29 6 views
4

에 제네릭이 아닌 유형을 주조 내가이 클래스있어 :일반적인 하나

class Foo { 
    public string Name { get; set; } 
} 

그리고이 클래스 다음

class Foo<T> : Foo { 
    public T Data { get; set; } 
} 

것은 내가하고 싶은 작업은 다음과 같습니다

public Foo<T> GetSome() { 
    Foo foo = GetFoo(); 

    Foo<T> foot = (Foo<T>)foo; 
    foot.Data = GetData<T>(); 
    return foot; 
} 

Foo를 Foo로 변환하는 가장 쉬운 방법은 무엇입니까 <T>? InvalidCastException을 직접 형변환 할 수 없습니다.) 수동으로 각 속성을 복사하고 싶지는 않습니다. 실제 사용 사례에서는 두 개 이상의 속성이 있습니다. 사용자 정의 유형 변환은 갈 수있는 방법입니까?

+0

'GetFoo'는 어떻게 생겼습니까? – Gabe

+0

이것은 단지 하나의 스텁 일뿐입니다. 새 Foo()로 바꿉니다. –

+2

그런 경우라면 근본적인 문제가 있습니다. 유형은 다른 유형이 될 수 없습니다. – leppie

답변

2

Foo에서 명시적인 변환을 Foo<T> 내에 만들 수 있습니다.

class Program 
{ 
    static void Main() 
    { 
     Foo foo = new Foo(); 
     foo.Name = "Blah"; 
     Foo<int> newfoo = (Foo<int>)foo; 
     Console.WriteLine(newfoo.Name); 
     Console.Read(); 
    } 
} 

class Foo 
{ 
    public string Name { get; set; } 
    public object Data { get; set; } 
} 

class Foo<T> 
{ 
    public string Name { get; set; } 
    public T Data { get; set; } 
    public static explicit operator Foo<T>(Foo foo) 
    { 
     Foo<T> newfoo = new Foo<T>(); 
     newfoo.Name = foo.Name; 
     return newfoo; 
    } 
} 

편집 : 상속없이이 경우에만 작동합니다. 사용자가 기본 클래스에서 파생 클래스로 사용자 정의 변환을 수행 할 수없는 것으로 보입니다.

우리는 미리 정의 변환 (캐스트) 기본 클래스 사이 의 자유를 촬영하고 파생 클래스가 있고, 우리 돈 언어 예측 의 의미를 만들기 위해 여기 http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/14cf27cf-b185-43d6-90db-734d2ca3c8d4/MADS Torgersen에서 주석을 참조하십시오 ' '을 쓰면으로 엉망이 될 수 있습니다.

Foo를 Foo<T>으로 바꾸는 방법을 정의하는 데 어려움을 겪고있는 것처럼 보입니다. 그것, 또는 상속을 드롭하십시오. 어느 솔루션도 특히 이상적이지 않습니다.

+0

그게 내가 생각했던 것입니다. 그냥 확인을 찾고 :) 감사합니다 –

+0

이것은 작동하지 않습니다 : "기본 클래스에서 또는 사용자 정의 변환이 허용되지 않습니다" –

+0

@ 존 Sheehan : 그의 예제가 작동하지만, 당신은 상속 있습니다. – leppie

1

InvalidCastException이 표시되는 경우 GetFoo()이 반환하는 Foo 유형은 Foo<T>이 아닙니다. Foo<T> 인스턴스를 반환 할 수 있도록 T 또는 typeof(T)을 전달해야합니다.

+0

캐스트 예외는'Foo foot = (Foo ) foo;'줄에 있으며 GetFoo()에서 반환 한 것이 아닙니다. 이것은 구조를 보여주기위한 스텁 일뿐입니다. –

+0

내 입장은 여전히 ​​유효합니다. 어디에서 문제가 발생했는지 확인하십시오. – leppie

+0

하지만 더 큰 질문에는 대답하지 않습니다. 나는 이미 캐스트가 가능하지 않다는 것을 알고있다. 그것은 나의 의도를 보여주는 데 불과하다. –

0

복사 생성자를 사용하십시오. 푸 구현합니다

class Foo { 
    Foo(Foo copy) { ... } 
} 

푸 설계되어야한다 동안 다음 사용 :

class Bar<T> : Foo { 
     Bar(Foo copy) : base(copy) { ... } 
} 

을 ... 예. 멤버별로 멤버를 복사해야하며 "복사본 생성자"에서 수행해야합니다.