C #: вернуть типы stong из отражения - PullRequest
0 голосов
/ 16 августа 2011

В последней версии C # возможно ли преобразовать динамический тип в сильный тип, если вы знаете его заранее?

Я использую отражение для вызова метода объекта,который возвращается к переменной:

var returnVal = context.GetType().InvokeMember(MethodName, BindingFlags.InvokeMethod, null, context, lParams.ToArray());

Я могу легко получить тип, возвращаемый в returnVal.Можно ли привести \ преобразовать Thins в более строго типизированную версию?

EDIT FOR CLARITY:

В этой ситуации я знаю тип возвращаемого, но толькострока.Чтобы получить тип, я должен сделать:

diAssemblies[k].GetType(diAssemblies[k].GetName().Name + "." + returnType)

Где returnType - имя возвращаемого типа.

В идеале, я бы хотел получить результатвызова метода в строго типизированном поле.

CONTEXT

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

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

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Если вы не знаете тип статически, как вы можете использовать статически типизированную ссылку? * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 'S *' ''}, так что если MyStrongType реализует IMyStrongBehavior, вы можете преобразовать возвращаемое значение вIMyStrongBehavior и используйте это статически.Базовое значение уже строго типизировано, независимо от того, произвели ли вы его.

В качестве альтернативы вы можете сохранить возвращаемое значение в переменной dynamic (что позволит вам вызывать известные методы без фактической статической типизацииинтерфейс.) Недостатком здесь является то, что вы не получаете Intellisense и любые ошибки, которые вы делаете, не будут отображаться до времени выполнения.

1 голос
/ 16 августа 2011

Нет, вы не можете получить преимущества конкретного типа, такие как проверка времени компиляции и intellisense. Это потому, что вы на самом деле работаете над типом во время выполнения. Это поздний предел, что означает, что это работа для динамического и DLR. Вы можете привести его к объекту, который, как вы знаете, будет наследовать фактический объект (например, объект), но вы не можете привести его к фактическому типу. Возможно, вы захотите посмотреть на дженерики как альтернативу, если у вас есть, например:

public T GetReturnVal<T>()
{
   return (T)context.GetType().InvokeMember(MethodName, BindingFlags.InvokeMethod, null, context, lParams.ToArray());
}

Вы бы, по крайней мере, возвращали конкретный тип вызывающим объектам типа T. Но этот тип должен быть установлен во время компиляции, то есть известно заранее.

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

...