저는 잠시 동안이 코드를 사용하고 있습니다. 테스트하기 전에 말 그대로 마지막 부분이므로 해결책을 찾으려고합니다.일반 인터페이스 유형 변환 문제
나는 다음과 같은 인터페이스와 클래스 (관련 부분에 간체)이 있습니다
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.Data
을 ITagParent<ITag>
번으로 캐스팅 할 때 오류가 발생합니다. 공역 및 공제로 인한 것임을 알고 있으며 (매우 안전하지 않은 경우) out
키워드로 ITagParent
인터페이스에 T
을 표시하는 것이지만 TagCollection
속성에서 사용 된 것처럼 보이지는 않습니다. 읽을 수 없습니다.
위의 내용을 ITagParent<CustomerTag>
으로 캐스팅했지만이 문제는 컴파일 할 때 'GetTagCurrentValue
메서드로 변환하려고하면 변환 할 수 없습니다'오류가 발생합니다.
내가 고려한 또 다른 옵션은 ITagParent
인터페이스 대신 기본 클래스를 사용하는 것이지만 Customer
개체가이 기본 구현에서 수정할 수없는 다른 기본 클래스에서 이미 상속되어 있기 때문에 작동하지 않습니다.
GetTagCurrentValue
메서드를 List<TagAddOn<CustomerTag>>
매개 변수 유형 및 기타 모든 변형으로 오버로드 할 수 있지만 실제로는 '포기'솔루션처럼 보입니다. 아마도 원하는 결과를 얻기 위해 리플렉션을 사용할 수는 있지만,이 방법은 다루기가 쉽지 않고 매우 효율적이지는 않을 것입니다. 특히이 방법이 특정 프로세스에서 많이 호출 될 수 있다고 생각하면 더욱 그렇습니다.
아무도 제안 사항이 있습니까?
감사합니다, 나는 (즉, 어떤 캐스팅 그것의 사용 부분에 더 일반적인 버전을 기대했다 'Customer' 객체에),하지만 당분간 이것은 나머지가 일반적이기 때문에 꽤 좋다. – XN16