У меня есть контейнер с набором 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));
но, естественно, это не работает. Не могли бы вы дать мне несколько советов? Спасибо.