2014-04-15 2 views
0

저는 잠시 동안이 코드를 사용하고 있습니다. 테스트하기 전에 말 그대로 마지막 부분이므로 해결책을 찾으려고합니다.일반 인터페이스 유형 변환 문제

나는 다음과 같은 인터페이스와 클래스 (관련 부분에 간체)이 있습니다

string value = TagAddOnManager.GetTagCurrentValue(
    ((ITagParent<ITag>)gridCell.Row.Data).TagCollection)); 

모두의 컴파일 :

public interface ITagParent<T> where T : ITag 
{ 
    List<TagAddOn<T>> TagCollection { get; set; } 
} 

public interface ITag 
{ 
    int Id { get; set; } 
    string Description { get; set; } 
    TagGroup TagGroup { get; set; } 
} 

public class TagAddOn<T> : ViewModelBase where T : ITag 
{ 
    private T _currentTag; 
    public T CurrentTag 
    { 
     get { return _currentTag; } 
     set { _currentTag = value; } 
    } 
} 

public partial class Customer : ITagParent<CustomerTag> 
{ 
    List<TagAddOn<CustomerTag>> _tagCollection; 
    public List<TagAddOn<CustomerTag>> TagCollection 
    { 
     get { return _tagCollection; } 
     set { _tagCollection = value; } 
    } 
} 

public partial class CustomerTag : ITag 
{ 
    public int Id { get; set; } 
} 

public class TagAddOnManager 
{ 
    public static string GetTagCurrentValue(List<TagAddOn<ITag>> dataObjectAddOns) 
    { 
     // LOTS OF SNIPPING! 
     return string.Empty; 
    } 
} 

나는이 같은 TagAddOnManager 클래스의 GetTagCurrentValue 방법을 사용하는 것을 시도하고있다 문제가 발생하지 않지만 gridCell.Row.DataITagParent<ITag> 번으로 캐스팅 할 때 오류가 발생합니다. 공역 및 공제로 인한 것임을 알고 있으며 (매우 안전하지 않은 경우) out 키워드로 ITagParent 인터페이스에 T을 표시하는 것이지만 TagCollection 속성에서 사용 된 것처럼 보이지는 않습니다. 읽을 수 없습니다.

위의 내용을 ITagParent<CustomerTag>으로 캐스팅했지만이 문제는 컴파일 할 때 'GetTagCurrentValue 메서드로 변환하려고하면 변환 할 수 없습니다'오류가 발생합니다.

내가 고려한 또 다른 옵션은 ITagParent 인터페이스 대신 기본 클래스를 사용하는 것이지만 Customer 개체가이 기본 구현에서 수정할 수없는 다른 기본 클래스에서 이미 상속되어 있기 때문에 작동하지 않습니다.

GetTagCurrentValue 메서드를 List<TagAddOn<CustomerTag>> 매개 변수 유형 및 기타 모든 변형으로 오버로드 할 수 있지만 실제로는 '포기'솔루션처럼 보입니다. 아마도 원하는 결과를 얻기 위해 리플렉션을 사용할 수는 있지만,이 방법은 다루기가 쉽지 않고 매우 효율적이지는 않을 것입니다. 특히이 방법이 특정 프로세스에서 많이 호출 될 수 있다고 생각하면 더욱 그렇습니다.

아무도 제안 사항이 있습니까?

답변

1

당신은 그

public class TagAddOnManager 
{ 
    public static string GetTagCurrentValue<TTag>(ITagParent<TTag> tagParent) 
     where TTag : ITag 
    { 
     // Just an example. 
     return tagParent.TagCollection.First().CurrentTag.Description; 
    } 
} 

같은 것을 사용하고 같이 사용할 수 있을까? '

var value = TagAddOnManager.GetTagCurrentValue((Customer)CustomergridCell.Row.Data); 
+0

감사합니다, 나는 (즉, 어떤 캐스팅 그것의 사용 부분에 더 일반적인 버전을 기대했다 'Customer' 객체에),하지만 당분간 이것은 나머지가 일반적이기 때문에 꽤 좋다. – XN16