Создание экземпляра класса из типа

Я пытаюсь создать экземпляр класса, который я могу добавить в список универсальным способом.

Я знаю 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, потому что для приведения к типу этот тип должен быть ссылочным типом (он же класс).

Другие вопросы по тегам