2010-07-16 6 views
1

저는 "Element"라는 기본 클래스를 가지고 있고 "Solid"와 "Fluid"라는 두 개의 다른 클래스를 파생했습니다.C#의 Type 개체에서 변수에 할당 할 수있는 방법이 있습니까?

class Element 
    {...} 

    class Solid : Element 
    { 
     public const int ElemType = 2; 
     ... 
    } 

    class Fluid : Element 
    { 
     public const int ElemType = 3; 
     ... 
    } 

"Element"클래스 "E1"의 인스턴스를 만들었습니다. 다음 메소드는 정수로 "ElType"과 "E1"을 인수로 취해 "Solid"또는 "Fluid"요소 (또는 나중에 소개 될 다른 "Element")로 "E1"에 할당합니다. "IElType == 2"및 "Fluid"유형이 "IElType == 3"인 경우 "E1"이 "솔리드"유형에 지정되어야하고 ... 동료가 파생되도록 할 수 있기를 원합니다. "Element"클래스에서 원하는만큼의 클래스를 만들고, "ElemType"에 적절한 값을 설정하여 프로그램이 "Element"를 인식하는지 확인하십시오. 어떤 방법이 있나요

E1 = new t1(); //Of course this is wrong! 

: 여기

private static void ElemInitializer(int ElType, out Element E1) 
    { 
     E1 = new Element(); 
     Type T1 = typeof(Element); 
     Type[] T2 = Assembly.GetAssembly(T1).GetTypes(); 
     List<Type> T3=new List<Type>(); 
     foreach (Type t1 in T2) 
     { 
      if (t1.IsSubclassOf(T1)) 
      { 
       MemberInfo[] M1 = t1.GetMembers(); 
       foreach (MemberInfo m1 in M1) 
       { 
        if (m1.Name == "ElemType") 
        { 
         FieldInfo F1 = t1.GetField("ElemType"); 
         int int1 = (int)F1.GetValue(t1); 
         if (int1 == ElType) 
         { 
          // Here I want to assign to E1 as t1 type. Such as: 
          // E1 = new t1(); Of course this is wrong! 
         } 
        } 
       } 
      } 
     } 
    } 

내가 "E1"가 "T1"유형이어야 할 문제이지만,이 같은 간단한 코드로이 작업을 수행 할 수 없습니다 "E1"을 "t1"유형으로 지정 하시겠습니까? 비 기술 영어 미안 해요.

+2

반환 값이 없을 때 왜 out 매개 변수를 사용합니까? –

답변

2

우선, 더 나은 명명 규칙을 사용하면 도움이되기 쉽고 장기적으로 자신을 도울 수 있습니다. 아래 코드가이를 수행해야합니다.

private static void ElemInitializer(int ElType, out Element E1) 
{ 
    E1 = new Element(); 
    Type typeofElement = typeof(Element); 
    Type[] assemblyTypes = Assembly.GetAssembly(T1).GetTypes(); 
    foreach (Type elementType in assemblyTypes) 
    { 
     if (elementType.IsSubclassOf(typeofElement)) 
     { 
     FieldInfo field = elementType.GetField("ElemType"); 
     int elementId = (int)field.GetValue(elementType); 
     if (elementId == ElType) 
     { 
      E1 = (Element)Activator.CreateInstance(elementType); 
      return; 
     } 
     } 
    } 
} 
+0

Visual Studio 2005를 .NET 2.0과 함께 사용합니다. 나중 버전으로 업그레이드해야합니까? CreatInstanceOf 메서드를 찾을 수 없으며 CreateInstance를 사용하여 개체에 대한 암시 적 변환 오류가 발생하기 때문입니다. –

+0

CreateInstanceOf라는 메서드가 없습니다. Activator.CreateInstance() 만 있습니다. –

+0

아니요 업데이트 할 필요가 없습니다. 나는 오류를 바로 잡았고 var가 2.0 이하로 컴파일되도록 제거했다. (당신이 지적한 오류는 어떤 버전에서도 컴파일되지 않을 것입니다) 저는 슬프게도 컴파일러를 가지고 테스트 할 수는 있지만 이번에는 올바르게 컴파일했다고 생각합니다. –

관련 문제