2010-06-07 35 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 2010-06-07 13:32:33

+0

@SWeko:絕對。將編輯以使其更清晰。 – 2010-06-07 13:38:32

+0

爲了讓事情更加複雜,Staff是一個IList,所以你不能只是實例化它,並添加新的元素,你也必須知道期望的實現...... – SWeko 2010-06-07 13:45:52

相關問題