Создать объект типа параметра - PullRequest
1 голос
/ 29 сентября 2010

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

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

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

    }

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

Ответы [ 3 ]

6 голосов
/ 29 сентября 2010

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

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

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

1 голос
/ 29 сентября 2010

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

Например:

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

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

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

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

0 голосов
/ 29 сентября 2010

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

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

...