Получить экземпляр универсального класса, используя Reflection - PullRequest
0 голосов
/ 29 октября 2018

У меня есть контейнер с набором Property.

public class Property<T> : INotifyPropertyChanged
{
    private T _value;

    public Property(string name)
    {
        Name = name;
    }

    public Property(string name, T value)
        : this(name)
    {
        _value = value;
    }

    public string Name { get; }

    public T Value
    {
        get
        {
            return _value;
        }
        set
        {
            if(_value == null || !_value.Equals(value))
            {
                _value = value;

                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(Name));
                }
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Как видите, свойство сделано Generic, потому что тип может быть другим. Проблема в том, что свойства настраиваются этим фрагментом xml:

<InputProperties> 
   <Property Type="System.UInt64" Name="Id"/>    
   <Property Type="System.DateTime" Name="Timestamp"/>   
   <Property Type="System.Byte" Name="State"/>    
</InputProperties>

Так что мои шаги должны быть:

1

Инициализирует контейнер, который содержит List<Property<dynamic>> (не любит динамический, но это единственный способ решить ошибку компиляции)

2

Разбор xml и создание универсального типа с помощью отражения

foreach(XElement xProperty in allconfiguredInputParameters)
{
   string xPropertyType = xProperty.Attribute("Type") != null ? xProperty.Attribute("Type").Value : String.Empty;
   string xPropertyName = xProperty.Attribute("Name") != null ? xProperty.Attribute("Name").Value : String.Empty;

   if (!String.IsNullOrEmpty(xPropertyType) && !String.IsNullOrEmpty(xPropertyName))
   {
      Type genericProperty = typeof(Property<>);
      Type constructedGenericProperty = genericProperty.MakeGenericType(new Type[] { GetTypeByFullname(xPropertyType) });

      var property = constructedGenericProperty.GetConstructor(new Type[] { typeof(String) }).Invoke(new object[] { xPropertyName });          
    }
 }

Свойство как объект содержит данные, которые я хочу, но я не могу привести их к свойству. То, что я хотел бы сделать, это:

myContainer.InputParamers.Add((Parameter<T>)property));

но, естественно, это не работает. Не могли бы вы дать мне несколько советов? Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...