2015-01-05 3 views
0

여러 게시물을 읽었지만 내 문제에 대해 적절한 대답을 찾지 못했습니다. 하지만 하나가 있어야합니다. 이 게시물이 실제로 중복되면 제발 기다려주세요.일반 유형의 속성 초기화

제네릭 형식을 구현하는 제네릭 형식의 속성을 초기화하려고합니다.

내 인터페이스는 다음과 같이 기본적으로 같습니다

public interface IMyInterface<TType> : IMyInterface 
{ 
    TType Value {get; set;} 

    // ... and some more ... 
} 

public interface IMyInterface 
{ 
    SetValue(string value); 
} 

내가 값을 설정해야 할 코드의 조각에 그들을 을 모른 채 IMyInterface을 구현하는 여러 클래스가 있습니다.

속성의 이름을 사용하지 않고 "값"- 속성을 초기화 할 수 있습니까? (?이 할 수있는 "좋은"방법이 있나요) -이되어 불가능 사전에 SetValue< TType >

void SetValue(object obj, string value) 
{ 
    // object obj implements IMyInterface<???> 
    PropertyInfo valueInfo = typeof(obj).GetType().GetProperty("Value") 
    valueInfo.SetValue(obj, Activator.CreateInstance(valueInfo.PropertyType)) 

    ((IMyInterface)obj).SetValue(value); 
} 

감사를 사용 할 수 있습니다.

편집 : - 제거 -

편집 2 :

는이 구조가 주어진다 :

public Interface IGeneric<TType> : INonGeneric 
{ 
    TType Value2 {get;} 
} 

public Interface INonGeneric 
{ 
    object Value1 {get;} 
} 

반사에서 "값 1"을 사용하여 정말 간단합니다 :

INonGeneric myObject = (INonGeneric)givenObject; 
doSomething(myObject.Value1) 

경우 "Value2"에 액세스해야합니다. 쉽지 않습니다. 첫 번째 예제에서 볼 수 있듯이 속성 이름이 하드 코드되어 있기 때문에 "Value2"에 액세스하는 가장 좋은 방법 인 것 같지 않은 다음 구문을 사용해야했습니다.

PropertyInfo valueInfo = givenObject.GetType().GetProperty("Value2"); 
object value = (object)valueInfo.GetValue(givenObject); 

더 좋은 해결책이 있습니까?

+0

경우는 어떻게? –

+1

나는 당신이 무엇을 요구하고 있는지 이해하지 못합니다. 'TType'이'string'이 아닌 경우, 수행해야 할 코드는 무엇입니까? 객체가'IMyInterface '이 아닌'IMyInterface' 만 구현하고 있다면 어떻게해야할까요? 그리고 무엇을 _specifically_ "초기화"한다는 의미입니까? 귀하의 코드 예제는 속성을 일부 기본값/인스턴스로 설정하려고 시도하지만 유형에 매개 변수없는 생성자가없는 경우에는 어떻게됩니까? 나는 당신이 문제를 유익한 방법으로 표현할 수있는 방법을 찾아 낼 수 있다고하더라도 "당신의 문제에 대한 해답이 있어야한다"는 것에 동의하지 않습니다. 일부 문제는 해결할 수 없습니다 (정당한 이유가 있음). –

+0

'IMyInterface '을 구현하는 클래스가 생성자를 사용하여 값을 초기화하지 않아서 Unity 클래스의 IOC 라이브러리를 통해 자동으로 수행 할 수있는 생성자 삽입도 가능합니다. – Saravanan

답변

1

당신이 가지고 있고 인스턴스가 IGeneric을 구현하고 Value2 속성 (일반적인 반환 유형이 있음)에 액세스하려는 경우.

것은, Generics는 컴파일 타임 형 안전을위한 것입니다. 타입 매개 변수를 모르는 경우 객체를 IGeneric < ...으로 캐스팅 할 수 없습니다. 그렇다면 왜 타입 매개 변수를 모르는 경우 Generics를 사용하고 싶습니까?

"문제"에 대한 해결책이 있습니다. IEnumerable 및 IEnumerable < T>와 동일합니다. 그것은 다음과 같이 보일 수 있습니다

public interface INonGeneric 
{ 
    object Value {get; } 
} 

public interface IGeneric<T> 
{ 
    T Value { get; } 
} 

public class Magic : INonGeneric, IGeneric<string> 
{ 
    object INonGeneric.Value { get { return this.Value; } } 
    public string Value { get { return "test"; } } 
} 

이 유형의 매개 변수를 사용하거나 컴파일시 형식 매개 변수를 알고있는 경우 일반 구현을 사용하지 않는 경우 이제 INonGeneric에 개체를 캐스팅 할 수 있습니다.

그러나 유형 매개 변수를 모른 채 일반 유형의 속성에 액세스하려는 경우 (제어 할 권한이 없음) 리플렉션 또는 동적을 벗어나지 않습니다.

동적 솔루션은 다음과 같을 수 있습니다 : IMyInterface , IMyInterface ': 클래스가``클래스 샘플 등 여러`IMyInterface 를 구현

dynamic generic = givenObject; 
object value2 = generic.Value2; 
+0

그리고 리플렉션을 사용하기로 선택한 경우 속성 이름을 하드 코딩하는 것 외에 다른 방법이 있습니까? – myst3rium

+0

@ myst3rium 동적으로 모든 속성을 반복 할 수 있지만 정확히 한 속성을 원한다면 다른 방법은 없습니다. 아마도 XmlSerializer/DataContractSerializer에서 이미 지원하는 것을 해결하려고 시도했을 것입니다. – Console

+0

나는 그것들을 사용할 것이지만 XmlSerializer는 약간의 제한이있다. E.G. 복잡한 유형, 목록 등을로드하거나 저장하고 싶습니다. 일반적으로 필요한 객체 (IPAddress, FileInfo, ....)로 직렬화 된 값을 변환하는 사이에 레이어가 필요합니다. 필자는 필자가 필요로하는 객체를 생성하는 독자적인 시리얼 라이저를 작성하기로 결정했다. 예 : Dict >. - 제네릭을 다루는 동안 비슷한 문제가 있었기 때문에 대답을 많이 해주셔서 고맙습니다. 이를 다루는 두 가지 방법 (IEnumerable-Implementation/dynamic)은 매우 흥미로워 보이며 조속히 자세히 살펴볼 것입니다. 고마워요! – myst3rium