Задать свойство для производного класса List <T>, созданного во время выполнения с использованием отражения - PullRequest
1 голос
/ 12 января 2020

Я использую отражение для создания экземпляра пользовательского класса `class MyList: MyBaseClass, IList´:

foreach (FieldInfo field in this.GetType().GetFields())
{
   if (field.FieldType.IsGenericType && field.FieldType.GetGenericTypeDefinition() == typeof(MyList<>))
   {
      var elementType = field.FieldType.GetGenericArguments()[0];
      var listType = typeof(MyList<>).MakeGenericType(elementType);
      var valueToSet= Activator.CreateInstance(listType);
      field.SetValue(this, valueToSet);
      ...
      valueToSet.MyName = field.Name; // does not work because "valueToSet" does not recognize this property
      ...
   }
}

Проблема в том, что деталь valueToSet.MyName = field.Name не распознает свойство MyName, которое мой Пользовательский класс MyList<T> имеет. Я также попытался определить мой MyList<T> как class MyList<dynamic> : MyBaseClass, IList<dynamic>, но часть valueToSet.MyName = field.Name теперь выдает ошибку System.ArgumentException HResult=0x80070057 Message=Object of type objects.MyList 1[System.Object] cannot be converted to type objects.MyList 1[MyNameSpace.MyObjectType1]...

Любой намек на то, как решить эту проблему? Я хотел бы сохранить свое первоначальное заявление без dynamics
Заранее спасибо!

1 Ответ

0 голосов
/ 12 января 2020

Есть несколько способов. Вы можете выбрать тот, который вы считаете наиболее подходящим для вас.

Продолжайте использовать отражение

PropertyInfo myNameProperty = listType.GetProperty("MyName");
myNameProperty.SetValue(valueToSet, field.Name);

Использование dynamic:

dynamic valueToSet= Activator.CreateInstance(listType);
...
valueToSet.MyName = field.Name;

Приведение к суперклассу

И, очевидно, как вы сказали в своих комментариях, вы можете объявить MyName в MyBaseClass. Это необычная вещь, которую можно сделать, но хорошо ... Учитывая, что MyName объявлено в MyBaseClass, вы можете привести valueToSet к MyBaseClass:

((MyBaseClass)valueToSet).MyName = field.Name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...