2009-07-02 3 views
0

둘 다 정적 변수 인 XmlTag를 포함하는 두 개의 클래스가 있다고 가정합니다. 두 번째 클래스는 첫 번째 클래스에서 상속됩니다. 사용중인 형식에 따라 XmlTag를 얻어야하는 템플릿 메서드가 있습니다. 유형 인스턴스를 만들 필요없이이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 여기에 컴파일되지 않는 예제가 있는데, 이는 제가 말하고자하는 것을 설명해 주어야합니다.정적 변수에 액세스하는 템플릿 메서드

class A{ 
public static readonly string XmlTag = "AClass"; 
} 

class B : A { 
public static readonly string XmlTag = "BClass"; 
} 

이 메서드는 현재 유효하지 않습니다. 정적 매개 변수는 형식 매개 변수에서 명백하게 액세스 할 수 없습니다.

string GetName<T>(T AClass) where T : A 
{ 
    return T.XmlTag; 
} 

답변

5

먼저 일반 방법을 템플릿으로 생각하지 마십시오. 그들은 템플릿이 아닙니다. 템플릿과는 매우 다른 동작을합니다. 그들이 템플릿처럼 행동한다는 기대는 아마도이 상황에서 당신을 잘못 이끌고있는 것일 수 있습니다.

여기에 귀하의 시나리오에 대해 쓴 기사 시리즈와 그 이유가 불법입니다.

http://blogs.msdn.com/ericlippert/archive/2007/06/18/calling-static-methods-on-type-variables-is-illegal-part-two.aspx

http://blogs.msdn.com/ericlippert/archive/2007/06/21/calling-static-methods-on-type-variables-is-illegal-part-three.aspx

물론 내가 3 부에서 암시은 "동적"기능은 C# 4.0 사실 전달에 있음을 참고

http://blogs.msdn.com/ericlippert/archive/2007/06/14/calling-static-methods-on-type-variables-is-illegal-part-one.aspx

.

실제 질문을 처리하려면 "이 작업을 수행하는 가장 좋은 방법은 무엇입니까?" 아마 이런 문제가 해결 될 것이라고 생각하는 문제가 있습니다. 이 메커니즘은 C#에는 실제로 존재하지 않습니다. 우리는이 메커니즘이 존재하기를 바란다는 사실에서 당신이 실제로 풀려고하는 문제를 추론하는 것은 불가능합니다. 대신 "C#에서이 불가능한 일을 어떻게 만들 수 있습니까?"라는 질문 대신 대신 이있는 실제 문제를 설명하고 실제 문제를 더 잘 해결하는 기존 C# 메커니즘을 찾아 내려고 노력할 수 있습니다.

+0

당신의 대답을 당신을 감사하십시오. 귀하의 기사는 흥미로운 읽을 거리였습니다. 내 문제는 상당히 간단하지만 좋은 해결책을 생각하는 데 어려움을 겪고있다. 각자 고유 한 xml-tag 상수를 가진 여러 개의 하위 클래스가있다. 나는 이러한 자식 클래스 중 하나를 받아들이고 해당 클래스의 인스턴스를 XmlNode에서로드하는 일반 클래스 Load()를 다른 클래스에 가지고 있습니다. Load()는 사용중인 유형에 따라 xml 태그를 가져와야 찾을 XML 태그를 알 수 있습니다. – Mav3rick

+0

하위 클래스는 XML 태그가 발견 된 후에 만 ​​인스턴스화됩니다. – Mav3rick

+0

여기에 몇 가지 유형이 있습니까? 두? 세? 수백? 또는 잠재적으로 무한대의 숫자입니까? –

1

리플렉션에 의지하지 않고 직접 할 수있는 방법은 없습니다.

당신이 정말이 (내가 먼저 높은 수준의 디자인을 변경하는 것을 고려하는 것이 좋습니다) 그렇게하려면 :

var returnValue = typeof(T).GetField("FieldName").GetValue(null); 

는 속성을 가져올 수 :

이 필드 값을 얻으려면

:
var returnValue = typeof(T).GetProperty("PropertyName").GetValue(null, null); 

는 메소드를 호출하려면

0

기본 클래스에 가상 GetTagName 클래스를 지정하고 상속 클래스에서이 클래스를 재정의하지 않는 이유는 무엇입니까?

class A{ 
public virtual string GetXmlTagName() 
    { 
    return "AClass"; 
    } 
} 

즉각적인 증상은 해결되지만 내 문제는 해결되지 않습니다. 그것은 destinct code 냄새가 있지만 더 많이 알지 못한다면 XML의 개념이 다른 클래스에 존재해야하고 A와 B의 개념이 단일 책임 원칙을 위반하고 있다고 말할 때 나는 틀릴 수도 있습니다.기본적으로 나는 그것의 단지 affraid 정보 Im에서 알 것입니다

+0

예, 작동하지만 클래스를 인스턴스화하기 전에 상수를 가져와야합니다. – Mav3rick

+0

그러면 게시 된 메서드 인 GetName 이 작동하지 않습니다. 게시 한 메서드는 T (T : A)라는 인수를 사용하므로 해당 메서드 내부에 항상 개체가 있습니다 (인수로 null을 전달하지 않는 한) –