2012-07-27 2 views
2

개체를 여러 가지 유형의 구조체 중 하나로 변환 할 방법을 찾고 있습니다. 나는 nullable이 아니기 때문에 구조체가 필요하다. 이 문제를 해결하는 방법을 모르겠지만 지금까지 시도한 이유는 다음과 같습니다. "개체가 IConvertible을 구현해야합니다." < - Convert.ChangeType개체를 generics로 struct로 변환하십시오.

public class Something 
{ 
    private object[] things; 

    public Something() 
    { 
     //I don't know at compile time if this will 
     //be an array of ThingA's or ThingB's 
     things = new object[1]; 

     things[0] = new ThingA(); 
     ThingA[] thingsArrayA = GetArrayofThings<ThingA>(); 

     things[0] = new ThingB(); 
     ThingB[] thingsArrayB = GetArrayofThings<ThingB>(); 
    } 

    public TData[] GetArrayofThings<TData>() where TData : struct 
    { 
     return (TData[])Convert.ChangeType(things, typeof(TData[])); 
    } 
} 

[Serializable] 
public struct ThingA 
{ 
    //... 
} 

[Serializable] 
public struct ThingB 
{ 
    //... 
} 

이 SERG의 대답에 작업 구현 덕분에 시도 :이 될 것 데이터가 있기 때문에

public TData[] GetArrayofThings<TData>() where TData: struct 
    { 
     return things.OfType<TData>().ToArray<TData>(); 
    } 

나는 아직도 .ToArray()에 대한 처벌에 대해 궁금 해요 스트림 개체로 보내면 많은 것들이있을 수 있습니다.

+0

왜 Null을 허용하지 않아야합니까? 어떤 맥락에서? 이것은 분명한 이유가없는 많은 작업처럼 보입니다 (그러나 나는 장님이 될 수 있습니다). –

+0

정확히 여기에서 달성하려는 것은 무엇입니까? 왜 nullable이 아닌 객체가 필요합니까? 게다가, 당신이 여기에서하려는 것을 완전히 이해했다고는 생각하지 않습니다. 즉석에서 개체를 구조체로 변환 할 수는 없습니다. 당신은 당신의 클래스와 구조체 사이의 어떤 형식의 변환이나 구조체를 정의 할 필요가있다. – Michael

답변

0

그것은 몇 LINQ 쿼리 나에게 보인다 충분할 것이다. Convert를 사용하지 마십시오

//getting only ThingA from mixed array 
IEnumerable<ThingA> thingsA = things.OfType<ThingsA>() 
//we know type of thins inside array, so we just need type conversion 
IEnumerable<ThingB> thingsB = things.Cast<ThingB>() 

, 그것은 (예를 들어, string int에) 실제 변환을 위해, 그리고 당신이해야하는 것은 타입 캐스팅입니다.

+0

이것이 나를 더 가까이에 모으고 있습니다. 스트림 객체에 IEnumerable 을 nullable이 아닌 매개 변수로 사용하려면 다음과 같이해야합니다. thingsA.ToArray (); 이로 인해 많은 오버 헤드가 발생합니까? – FrozT

0

ChangeType 메서드 서명은 두 개의 매개 변수를 노출합니다. 첫 번째는 value이며 IConvertible 인터페이스를 구현하는 개체 여야합니다. 귀하의 예에서 thingsobject 배열이며 해당 인터페이스를 구현하지 않습니다. 이 같은 다른 방법으로 GetArrayOfThings 방법을 설계해야합니다 :

공공 TDATA [] GetArrayofThings()을 TObject의 경우 : IConvertible, TDATA : 구조체

관련 문제