DLR и отражение

Везде, где я читал о новой DLR в .net 4, говорят, что хорошее применение для нее — это рефлексия, а всегда показываемый фрагмент кода — что-то вроде

dynamic d = GetSomeObject();
d.DoSomething();
d.SomeMember = 1;

Как выглядит GetSomeObject()? Я не могу найти нигде, что объясняет это.

Я понимаю, что это может быть что угодно, но в контексте отражение что это? Это сборка? экземпляр типа?


person Community    schedule 30.12.2009    source источник


Ответы (4)


Возвращаемый тип GetSomeObject() будет экземпляром некоторого типа. Например, вот как это может выглядеть:

public Customer GetSomeObject() {
    return new Customer("John", "Doe", 12345);
}

И тогда код сказал бы:

dynamic customer = GetSomeObject();
string s = customer.FirstName;
// now the "s" variable would have "John" in it

GetSomeObject() может вернуть что угодно. Он может возвращать объект Customer или Product. И это не имеет значения! Идея состоит в том, что когда переменная объявлена ​​как dynamic, то при вызове метода или свойства, как вы показали, компилятор сгенерирует код, использующий Reflection, чтобы попытаться вызвать метод или свойство. Если они существуют, то вызовы будут успешными. Если нет, то вы получите ошибку во время выполнения.

В общем случае этот пример просто упрощает использование Reflection, заставляя компилятор генерировать код за вас.

Сказав это, если объект Customer или Product сам реализует IDynamicObject, то они могут делать гораздо более сложные вещи.

person Eilon    schedule 30.12.2009

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

  • настоящий динамический объект (IDynamicObject)
  • любой обычный объект, через отражение

Полезным примером (по крайней мере, для чтения свойств) может быть анонимный тип; это также может быть COM-объект, например, или (в Silverlight) объект в html DOM. Или это может быть объект Customer вашего поставщика, который не реализует какой-либо общий интерфейс, но удивительно похож на ваш собственный объект InternalCustomer. Черт возьми, это может быть объект IronPyton.

person Marc Gravell    schedule 30.12.2009
comment
Я понимаю, что это может быть что угодно. Я обновил свой вопрос, чтобы быть немного более конкретным - person ; 30.12.2009

Ну, GetSomeObject() может, например, вернуть экземпляр типа _ComObject. Я думаю, что это одна из основных причин его наличия dynamic.

person Dmitri Nesteruk    schedule 30.12.2009

Я думаю, что более интересно, с точки зрения динамики, DLR и отражения, посмотреть, что произошло, например, в строке 2.

используя dynmic, вы идете так: dynamic d = GetSomeObject(); д.Сделать что-нибудь();

а с отражением немного шумнее

var d = GetSomeObject();
var mi = d.GetType().GetMethod("DoSomething");
mi.Invoke(d,mi);

На мой взгляд, первый более элегантный, и мы говорим о методе без аргументов, все может сойти с ума, когда вы взаимодействуете с COM или API с длинными методами подписи. Я был там ;)

person Alejandro Miralles    schedule 03.05.2012