Сделать новый объект с отражением?

Я не уверен, возможно ли это, и после долгих исследований я не нашел чего-то убедительного.

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

Образец кода

public T getObject(Dictionary<string, string> myDict)
{
 // make a new object type with the keys and values of the dictionary. 
 // sample values in dictionary:
 // id : 112345
 // name: "greg"
 // gender: "m"
 // Eventually also make the interface?
}

// Somewhere else:
var myNewObject = helper.getObject();
// what is expected here is that when I type myNewObject. 
// I get id, name, gender as suggestions
int id = myNewObject.Id;

Что для меня важно, так это вытащить из себя интеллигентность. Так что я могу напечатать object. и предложения со всеми ключами будут выходить. Таким образом, мне не нужно знать словарь заранее, чтобы получить доступ к значениям (иначе я бы просто использовал словарь).

Я посмотрел на глину, но мне не ясно, как использовать ее, чтобы получить смысл, как я хочу. Я также нашел этот пост об этом.

Кроме того, я проверил ImpromptuInterface, но для обеих документов плохо, или я не могу понять это.

Если это возможно с Clay (это, похоже, похоже), как я могу это сделать, чтобы он мог работать как библиотека в других проектах, которые не будут ссылаться на Clay?

Если что-то неясно или это дубликат, не стесняйтесь комментировать.

1 ответ

Чтобы позволить IntelliSense работать, результирующий тип должен быть известен во время компиляции. Так что в то время, когда вы работаете с object Вы должны знать его конкретный тип (или, по крайней мере, тип или интерфейс настолько конкретный, насколько вам нужно - наличие всех методов и свойств, к которым вы хотите получить доступ).

Трудно понять, что вы на самом деле пытаетесь сделать, но если вы знаете тип во время компиляции, вы можете сделать свой вспомогательный метод универсальным:

public T GetObject<T>(Dictionary<...> dictionary)

Это позволяет вам указать тип, который вы ожидаете на сайте вызова:

var obj = GetObject<SomeType>(dictionary);

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

var obj = (SomeType)helper.getObject();

Если вы не знаете конкретный тип, вам, по крайней мере, потребуется общий интерфейс (или базовый класс), который вы можете использовать. Для реализации этого интерфейса будет создан тип, сгенерированный во время выполнения. Но вы сможете получить доступ только к тем членам, которые известны во время компиляции. Как компилятор узнает все возможные ключи, которые могут существовать в вашем словаре во время выполнения? Вы пытаетесь закодировать какой-то контракт - поэтому формализуйте этот контракт в интерфейсе (например) и заставьте сгенерированный тип во время выполнения реализовать этот интерфейс.

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