приведение типов среды выполнения .net при использовании отражения - PullRequest
2 голосов
/ 07 июня 2010

Мне нужно преобразовать общий список конкретного типа в общий список интерфейса, который реализуют конкретные типы. Этот список интерфейсов является свойством объекта, и я присваиваю значение с помощью отражения. Я знаю только значение во время выполнения. Ниже приведен простой пример кода, который я пытаюсь выполнить:

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. Помогут ли новые ковариантные или контравариантные функции?

Заранее спасибо.

1 Ответ

3 голосов
/ 07 июня 2010

Нет, дисперсия .NET 4 здесь не поможет: IList<T> является инвариантом, так как значения входят и выходят (вы можете добавлять элементы и извлекать их).

По сути, это приведение не будет работать (если вы не используете массив и его свойства дисперсии; это просто ужасно). Само приведение не требуется - SetValue просто берет object - но попытка установить свойство с неверным типом завершится неудачей.

Вы можете создать новый список правильного типа - но это означает, что он будет отделен от существующего списка. Это приемлемо? (Сами элементы списка будут общими, но если вы добавите новый элемент в один список, он не будет показан в другом.)

...