使用反射时的.net运行时类型转换

标签 .net generics reflection properties

我需要将具体类型的通用列表转换为具体类型实现的接口(interface)的通用列表。该接口(interface)列表是对象的属性,我使用反射分配值。我只知道运行时的值。下面是我想要完成的简单代码示例:

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。新的协变或逆变特征会有帮助吗?

提前致谢。

最佳答案

不,.NET 4 差异在这里没有帮助:IList<T>是不变的,因为值既可以输入也可以输出(您可以添加项目并且可以获取它们)。

基本上这个转换是行不通的(除非你使用数组及其方差属性;但这太可怕了)。 Actor 本身不是必需的 - SetValue只需 object - 但尝试设置错误类型的属性将会失败。

您可以构建一个正确类型的列表 - 但这意味着它将与现有列表分开。这是可以接受的吗? (列表元素本身将被共享,但如果您将新元素添加到一个列表中,则它不会显示在另一个列表中。)

关于使用反射时的.net运行时类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2989803/

相关文章:

c# - 在循环中初始化变量的线程

c# - 格式化复选框?

.net - 如何强制.NET 3.5应用程序在.NET 4.5运行时上运行?

c# - 正则表达式.替换标点符号

c++ - 测试函数是虚函数还是构造函数

c# - .NET 是否有一种简单的方法来处理溢出列表?

java - gemfire 教程中的泛型用法

java - 我可以以某种方式部分实现单个类的一堆泛型吗

c# - 隐藏三元运算符的扩展

go - 使用反射模板创建值时的意外故障地址