Создать объект типа параметра

Привет. Возможно ли иметь метод, который позволяет пользователю передавать параметр определенного типа и создавать экземпляр нового объекта этого типа? Я хотел бы сделать что-то вроде этого: (я не знаю, подходят ли дженерики, но попробовал)

    public void LoadData<T>(T, string id, string value) where T : new()
    {

        this.Item.Add(new T() { ID=id, Val = value});

    }

Вышеприведенное не работает, но идея состоит в том, что пользователь передает тип объекта, который он хочет создать, и метод заполняет детали на основе этих параметров. Я мог бы просто передать параметр Enum, выполнить Switch и создать новые объекты на его основе, но есть ли лучший способ? Благодарность


person XSL    schedule 29.09.2010    source источник


Ответы (3)


Единственный способ сделать это — добавить интерфейс, который также указывает параметры, которые вы хотите установить:

public interface ISettable
{
    string ID { get; set; }
    string Val { get; set; }
}

public void LoadData<T>(string id, string value) where T : ISettable, new()
{
    this.Item.Add(new T { ID = id, Val = value });
}

К сожалению, я не могу проверить, чтобы проверить в данный момент.

person Justin Niessner    schedule 29.09.2010
comment
Свойства связаны с интерфейсом. - person XSL; 29.09.2010
comment
@SSL - тогда, если для интерфейса также требуются установщики, вам просто нужно добавить этот интерфейс в ограничения. - person Justin Niessner; 29.09.2010
comment
как вызвать LoadData<T>, если было бы лучше, если бы вы опубликовали небольшой рабочий код с универсальным. Благодарность - person Mou; 31.10.2016

Если свойства ID и Val исходят из общего базового класса или интерфейса, вы можете ограничить T наследованием этого типа.

Например:

public void LoadData<T>(string id, string value) where T : IMyInterface, new()

Затем вы можете использовать все элементы IMyInterface в T экземплярах.

Если это просто несвязанные свойства в разных типах, которые имеют одно и то же имя, вам придется использовать отражение.

Кроме того, вам необходимо удалить T, из списка параметров.

person SLaks    schedule 29.09.2010

Язык с более динамичной типизацией мог бы сделать это с легкостью. Я уверен, что это возможно с С#, просто потребуется больше усилий. Там, вероятно, есть какая-то библиотека отражения, которая поможет вам здесь.

Почему бы вам просто не создать объект при вызове метода? То, что вы пытаетесь сделать, кажется мне слишком сложным.

person toc777    schedule 29.09.2010
comment
Код был довольно простым и на C#. Почти одна строка для моего приложения. Я не знаю, что такое тип объекта, что было проблемой. - person XSL; 29.09.2010
comment
Но вы должны знать тип объекта, когда вызываете метод, чтобы он работал. - person toc777; 30.09.2010
comment
Теперь, когда вы используете интерфейс, мне кажется, что вы можете отказаться от дженериков и просто полагаться на интерфейс. - person toc777; 30.09.2010