Хорошо, я ищу какой-то ввод, я почти уверен, что в настоящее время он не поддерживается в .NET 3.5, но здесь идет речь.
Я хочу, чтобы универсальный тип, передаваемый в мой класс, имел конструктор, подобный этому:
new(IDictionary<string,object>)
чтобы класс выглядел следующим образом
public MyClass<T> where T : new(IDictionary<string,object>)
{
T CreateObject(IDictionary<string,object> values)
{
return new T(values);
}
}
Но компилятор этого не поддерживает, он не знает, о чем я спрашиваю.
Некоторые из вас могут спросить, почему вы хотите это сделать? Ну, я работаю над любимым проектом ORM, поэтому я получаю значения из БД, а затем создаю объект и загружаю значения.
Я думал, что было бы чище позволить объекту просто создавать себя со значениями, которые я ему даю. Насколько я могу судить, у меня есть два варианта:
1) Используйте рефлексию (которую я стараюсь избегать), чтобы получить массив PropertyInfo [], а затем используйте его для загрузки значений.
2) требует, чтобы T поддерживал такой интерфейс:
открытый интерфейс ILoadValues
{
void LoadValues (значения IDictionary);
}
и затем сделайте это
public MyClass<T> where T:new(),ILoadValues
{
T CreateObject(IDictionary<string,object> values)
{
T obj = new T();
obj.LoadValues(values);
return obj;
}
}
У меня проблема с интерфейсом, я думаю, философская, я не хочу показывать публичный метод для загрузки значений. Используя конструктор, идея заключалась в том, что если бы у меня был такой объект
namespace DataSource.Data
{
public class User
{
protected internal User(IDictionary<string,object> values)
{
//Initialize
}
}
}
Пока MyClass<T>
находится в одной сборке, конструктор будет доступен. Я лично считаю, что ограничение Типа, по моему мнению, должно спросить (есть ли у меня доступ к этому конструктору? Да, отлично!)
В любом случае, любые входные данные приветствуются.