2010-06-07 4 views
2

구체적인 유형의 일반 목록을 구체적인 유형이 구현하는 인터페이스의 일반 목록으로 캐스팅해야합니다. 이 인터페이스 목록은 객체의 속성이며 리플렉션을 사용하여 값을 할당합니다. 나는 그 가치를 단지 실행 시간에 알았다.리플렉션을 사용할 때 .net 런타임 유형 캐스팅

public void EmployeeTest() 
    { 
     IList<Employee> initialStaff = new List<Employee> { new Employee("John Smith"), new Employee("Jane Doe") }; 
     Company testCompany = new Company("Acme Inc"); 
     //testCompany.Staff = initialStaff; 

     PropertyInfo staffProperty = testCompany.GetType().GetProperty("Staff"); 
     staffProperty.SetValue(testCompany, (staffProperty.PropertyType)initialStaff, null); 
    } 

클래스가과 같이 정의된다 :

public class Company 
{ 
    private string _name; 

    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    private IList<IEmployee> _staff; 

    public IList<IEmployee> Staff 
    { 
     get { return _staff; } 
     set { _staff = value; } 
    } 

    public Company(string name) 
    { 
     _name = name; 
    } 
} 

public class Employee : IEmployee 
{ 
    private string _name; 

    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    public Employee(string name) 
    { 
     _name = name; 
    } 
} 

public interface IEmployee 
{ 
    string Name { get; set; } 
} 

어떤 생각 아래는 내가 달성하기 위해 노력하고 있습니다 무엇의 간단한 코드 예제는?

.NET 4.0을 사용 중입니다. 새로운 공변 또는 반동적 기능이 도움이 될까요?

미리 감사드립니다.

답변

3

아니요. .NET 4 분산은 여기에 도움이되지 않습니다. IList<T>은 값이 불규칙하므로 (항목을 추가하고 가져올 수 있음) 값이 그대로 유지됩니다.

기본적으로이 캐스트는 작동하지 않습니다 (배열 및 해당 분산 속성을 사용하는 경우가 아니라면이 설정은 무서운 것입니다). 캐스트 자체가 필요하지 않습니다. SetValue은 단지 object이 걸리지 만 잘못된 유형으로 속성을 설정하려는 시도는 실패합니다.

오른쪽 유형의 목록을 작성할 수 있습니다. 이는 기존 목록과 별개임을 의미합니다. 그게 받아 들일 수 있니? 목록 요소 자체는 공유되지만 목록에 새 요소를 추가하면 다른 목록에 표시되지 않습니다.

+0

목록은 새로운 것이지만 직원은 동일한 이전 개체가됩니다 – SWeko

+0

@SWeko : 당연하지. 더 명확하게 편집 할 것입니다. –

+0

이 문제를 추가로 복잡하게하기 위해 Staff는 IList이므로 인스턴스화 할 수없고 새로운 요소를 추가 할 수 없으므로 원하는 구현을 알아야합니다. – SWeko