Создание экземпляра класса из типа
Я пытаюсь создать экземпляр класса, который я могу добавить в список универсальным способом.
Я знаю type
класса, который должен быть сделан, и я смог сделать object
класса с использованием приведенного ниже кода, но я не нашел способ создать приведение, которое позволит мне добавить это в список... какие-нибудь идеи?
T такой же, как objType
public static List<T> LoadList(string fileName, Type objType)
{
List<T> objList = new List<T>();
object o = Activator.CreateInstance(objType);
objList.Add((**o.GetType()**)o);
return objList;
}
если есть лучший способ сделать это слишком я открыт для идей:)
3 ответа
Просто используйте неуниверсальный API:
((IList)objList).Add(o);
Я также предполагаю, что type
является универсальным параметром типа; просто сказать: type
смущает это; T
или же TSomethingSpecific
было бы более идиоматичным.
Также: эта линия нуждается в исправлении:
List<type> objList = new List<type>(); // <=== not new List<Object>
При условии <type>
такой же как objType
Я бы предложил отбросить отражение и использовать ограничение типа where T: new():
public static List<T> LoadList(string fileName)
where T : new()
{
List<T> objList = new List<T>();
objList.add(new T());
return objList;
}
Редактировать:
Если objType
это подкласс T
тогда я думаю, что что-то в этом роде должно работать:
public static List<TListType, T> LoadList(string fileName)
where T : TListType, new()
{
List<TListType> objList = new List<TListType>();
objList.add(new T());
return objList;
}
Вы можете использовать предложение Зака Джонсона с where
ограничение, поскольку оно устраняет дублирующую спецификацию типа. Однако, если подпись установлена в камне, вы можете обойтись простым as
бросить, как:
public List<T> LoadList<T>(Type objType) where T : class
{
List<T> objList = new List<T>();
T item = (Activator.CreateInstance(objType) as T);
objList.Add(item);
return objList;
}
Это также требует ограничения where, потому что для приведения к типу этот тип должен быть ссылочным типом (он же класс).