2010-01-08 3 views
4

문자열에서 클래스를 인스턴스화하는 방법에 대해 많은 질문을했지만 구조를 만드는 것과 관련하여 정보를 찾을 수 없었습니다.C#의 문자열에서 구조 만들기

는 그래서 같은 구조를 포함하는 클래스가 :

Public Structure callDetails 
    Public GUID As Guid 
    Public ringTime as Date 
    Public CBN As String 

내가 정말로 원하는 모든 구조에서 필드 이름을 얻을 수 있습니다. 필드의 데이터를 조작하는 데 신경 쓰지 않습니다.

지금까지 나는 이것에 매우 가까워 질 수 있었다.

 callDetails callTableDef= new callDetails(); 

     Type tableType = callTableDef.GetType(); 

     object tableStruct = (object)Activator.CreateInstance(tableType); 
     System.Reflection.FieldInfo[] fields = tableType.GetFields(); 
     foreach (System.Reflection.FieldInfo field in fields) 
     Debug.WriteLine(field.Name + " = " + field.GetValue(tableStruct)); 

그러나 실제로 구조체의 인스턴스를 실제 이름으로 만들어야합니다. 나는이 같은 문자열을 전달 할 수 있도록하려면 :

Type tableType = System.Type.GetType("callDetails"); 

나는 Activator.CreateInstance로()에서 경우 ArgumentNullException를 얻을 수행 할 때

에 전달 된 값을 조회하기로 GetType을하지 않는다 문자열로 반환하고 형식을 반환합니까?

저는이 프로젝트가 시작되기 전까지 대부분 Java로 프로그래밍 된 C#을 처음 사용했습니다.

+1

PascalCase !!!!!! – Will

답변

5

당신은 그것의 네임 스페이스와 형식 이름을 한정해야합니다 :

Type tableType = System.Type.GetType("mynamespace.callDetails"); 

그것을 다른 어셈블리에 있다면, 당신은 어셈블리 정규화 된 이름이 필요합니다. 자세한 내용은 on MSDN을 (를) 찾을 수 있습니다. 가지고 계신대로 타입 이름만으로는 해결할 수 없으며 null을 반환하므로 인수 null 예외가 발생합니다.

1

구조체 또는 클래스에 액세스 할 수있는 경우 참조를 의미하므로 GetType을 사용하는 것이 더 좋습니다. 그 이유는 문자열 대신 struct/class를 사용하기 때문입니다. MSDN 참조가 정확히 것을

,

Type tableType = typeof(callDetails); 
0

감사 다윗이 오류가있을 때 컴파일 타임에 실패 할 수 있습니다 의미하며, 또한 당신에게 C#에서 더 나은 리팩토링 가능성

Type tableType = GetType(callDetails) 

을 제공합니다 내가 필요한 것. 나는 그것을 어떻게 알았는지 많은 방법으로 예선 해 보았습니다. 그 반원은 다른 집회에 있었다. 시도 :

Type tableType = System.Type.GetType("CommonTables.callDetails"); 

효과 없음.

를 디버그에 다음 작성 후 : 여기이 질문을보고 다른 사람을 위해

내가해야 할 일을했을거야

Debug.WriteLine("DEBUG ASSEMBLY QUALIFIED NAME= " + callTableDef.GetType().AssemblyQualifiedName.ToString()); 

이 어셈블리 자격을 갖춘 이름으로 저에게이 했다.

CommonTables.callDetails, callDetails, Version=3.0.4.0, Culture=neutral, PublicKeyToken=null 

그리고 getType() 메소드에서 사용해야하는 문자열입니다. 그냥 assembly.classname이 작동하지 않습니다.

관련 문제