2015-02-03 2 views
0

메서드에 대해 선언 된 형식을 가진 함수를 호출하려고합니다.형식을 파일에서 읽을 때 항목을 반환하는 방법

public T Get<T>(). 

파일에서 문자열을 읽고이를 스위치를 통해 구문 분석하여 사용 된 유형을 확인합니다.

switch (type) 
{ 
    case "Text": 
     item = Get<Text>(); 
     break; 
    case "Button": 
     item = Get<Button>(); 
     break; 
} 

어떻게 내가 호출 된 함수에서 Type 항목을 반환할까요? 파생 클래스의 메서드에 액세스해야하므로 일반 부모를 반환하고 싶지 않습니다.

public <????> newGet() 
{ 
    switch (type) 
    { 
     case "Text": 
      item = Get<Text>(); 
      break; 
     case "Button": 
      item = Get<Button>(); 
      break; 
    } 
    return item; 
} 
+3

제네릭에서는이를 수행 할 수 없습니다. 그것들은 컴파일 타임 전용 기능입니다. '동적'을 사용할 수 있습니까? – Blorgbeard

+0

고마워요 @ Blorgbeard. 이것은 내가 겪었던 누락 된 정보입니다! – Scotty

+0

'Text'와'Button' 유형은 무엇입니까? 그게 너의 타입이야? 직접 정의한 경우 기본 유형에서 파생 시키거나 공통 인터페이스를 구현 한 다음 반환 유형을 공통 기본 유형 또는 인터페이스로 선언하고 두 가지 유형의 객체를 모두 반환 할 수 있습니다. –

답변

3

dynamic을 사용하는 것은 좋지 않은 생각입니다. 여기서하는 일을 재고해야합니다.

"파생 클래스의 메서드에 액세스해야하므로 공용 부모를 반환하고 싶지 않습니다."

좋아, 그럼 ...이 방법에 액세스하려면 어떻게해야할까요? switch을 사용하여 유형을 전환 한 다음 원하는 메소드를 호출하십시오. 왜 똑같은 일을하는 두 개의 switch 문장이 있습니까? 나는 당신이 다루는 것에 대한 정확한 아키텍처를 모른다. 그러나 일반적으로 당신은 어떤 타입을 되 찾으려하는지 ("Text"나 "Button"을 반환하는 것, 혹은 함수를 호출 한 다음 강력하고 형식화 된 함수를 호출하여 해당 함수를 가져 와서 메서드를 호출합니다.

+0

@ChrisV 입력에 감사드립니다. 모든 유형 (거의 없을 것입니다)에 공통적이지 않은 메소드를 사용할 때마다 "GetType"점검을 수행 할 계획이었습니다. 나는 그것이 약간 까다 롭다는 것을 알지만, 매번'Type t = newGetType (name);'var item = newGet (name);'을 할 때보 다 덜 복잡합니다. 방금 VS에서 간단한 데모를 시도했는데 Type을 반환 유형으로 사용할 수없는 것처럼 보입니까? 이것은 C#의 두 번째 날이기 때문에 개선을 제안하십시오. – Scotty

+0

공통 기본 클래스의 메소드를 주로 사용하는 경우 객체를 기본 클래스로 반환하십시오. 파생 클래스의 메소드를 사용하려면'if (item is Type) {...} '를 사용하여 유형을 확인할 수 있습니다. 이것은 당신의 목적을 위해서'GetType'보다 낫습니다. 'is' 연산자는 파생 클래스에 대해 true를 반환하므로'Dog' 유형의 항목에서는'item is Animal'이 true이고'typeof (item) == GetType (Animal) '은 false가됩니다. 그래서'item is Button'은'Button'의 하위 클래스를 다루는 경우에 true입니다. – ChrisV

+0

안녕하세요 ChrisV,'if (item is Type) {...} '을 사용하면 어떻게 파생 클래스 메서드에 액세스 할 수 있는지 알 수 없습니다. 예를 들어, 'UIItem item = newGet (name);'if (item is Button) {// 여기에 성공적으로 도착했지만 Button에 액세스 할 수 없습니다.누르기()}' – Scotty

1

동적 유형을 사용할 수 있습니다. 그것은 내가 newGet

이 또한 작동 할 수
dynamic text= newGet("Text"); 
Console.WriteLine(text.Length); //"ABC".Length = 3 

dynamic number= newGet("Number"); 
Console.WriteLine(number + 5); //1 + 5 = 6 

에서 반환 된 문자열의 길이를 사용할 수 있습니다, 당신이 볼 수 있듯이 .NET 4.0 및

public dynamic newGet(string type) 
{ 
    dynamic item = null; 
    switch (type) 
    { 
     case "Text": 
     item = "ABC"; 
     break; 
     case "Number": 
     item = 1; 
     break; 
    } 
    return item; 
} 

이상 만 사용할 수 있습니다. 런타임 예외 상황에주의하십시오.

string text= newGet("Text"); //You can assign to 
Console.WriteLine(text.Length); //"ABC".Length = 3 

int number= newGet("Number"); 
Console.WriteLine(number + 5); //1 + 5 = 6 
관련 문제