2010-09-29 4 views
1

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

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

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

    } 

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

ответ

6

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

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 }); 
} 

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

+0

Свойства сжимаются с интерфейсом. – XSL

+0

@SSL - Тогда, пока интерфейс также требует установки, вам просто нужно добавить этот интерфейс к ограничениям. –

+0

Спасибо, это работает отлично. – XSL

1

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

Например:

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

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

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

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

+0

Спасибо за помощь. – XSL

0

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

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

+0

Код был довольно прост в C#. Довольно много строк для моего приложения. Я не знаю, что такое тип объекта, в чем проблема. – XSL

+0

Но вы должны знать тип объекта, когда вы вызываете метод его работы. – toc777

+0

Теперь, когда вы используете интерфейс, мне кажется, что вы можете избавиться от дженериков и просто положиться на интерфейс. – toc777

Смежные вопросы