Создайте экземпляр типа, предоставленный в качестве параметра для метода - PullRequest
2 голосов
/ 17 ноября 2009

Класс для создания экземпляра:

public class InstantiateMe
{
    public String foo
    {
        get;
        set;
    }
}

Какой-то псевдокод:

public void CreateInstanceOf(Type t)
{
    var instance = new t();

    instance.foo = "bar";
}

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

Вот мои критерии успеха:

  • Создать экземпляр любого типа
  • Создание экземпляров типов без вызова их конструктора
  • Доступ ко всем общедоступным объектам

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

Ответы [ 3 ]

4 голосов
/ 17 ноября 2009

В основном вам нужно использовать Reflection. Используйте Activator.CreateInstance() для создания вашего типа, а затем вызовите InvokeMember() для типа, чтобы установить свойство:

public void CreateInstanceOfType(Type t)
{
    var instance = Activator.CreateInstance(t); // create instance

    // set property on the instance
    t.InvokeMember(
        "foo", // property name
        BindingFlags.SetProperty,
        null,
        obj,
        new Object[] { "bar" } // property value
    );
}

Чтобы получить доступ ко всем свойствам универсального типа и установить / получить их, вы можете использовать GetProperties(), который возвращает коллекцию PropertyInfo, которую вы можете перебирать:

foreach (PropertyInfo property in type.GetProperties())
{ 
    property.GetValue() // get property
    property.SetValue() // set property
}   

Также, смотрите документацию , чтобы узнать больше способов использования InvokeMember().

4 голосов
/ 17 ноября 2009

Попробуйте следующее для фактического создания экземпляра.

Object t = Activator.CreateInstance(t);

Тем не менее, без обобщений и ограничений статический доступ к элементам невозможен, как показано в вашем примере.

Вы можете сделать это с помощью следующего

public void CreateInstanceOf<T>() where T : InstantiateMe, new()
{
    T i = new T();
    i.foo = "bar";
}
0 голосов
/ 17 ноября 2009

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

public static T New() where T : new()
{
    return new T();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...