Динамически найти параметр, который будет передан как <T>в общий метод - PullRequest
0 голосов
/ 17 июня 2010

Общий метод определяется следующим образом:

    private static T GetComparisonObject<T>(ComparisonAttribute attribute, object objectToParse)
    {

        // Perform a some action
        return (T)resultObject;
    }

Метод вызывается следующим образом:

var srcObjectToCompare = GetComparisonObject<DynamicType>(attributeToCompare, srcObject);

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

<add attributename ="Count" attributetype ="MemberInformation" attributeparam ="Count" type="System.Int32" comparertype="ditCreditEMGTestAutomationDifferenceEngine.Comparers.TypeComparer, ditCreditEMGTestAutomationDifferenceEngine.dll"  />

Токен, который передается в <> для универсальных методов, должен быть типом, для которого вызывается метод.Из конфигурации ключа type в XML может быть создан экземпляр Type, представляющий тип {то есть Type.GetType ("System.Int32")}, но как можно сгенерировать определение типа, которое затембыть переданы в общий метод?

Надеюсь, здесь не упущено что-то элементарное !!: -O

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 17 июня 2010

Вызов универсального метода с использованием отражения

MethodInfo method = typeof(YourClass).GetMethod("GetComparisonObject");
MethodInfo generic = method.MakeGenericMethod(GenericArgumentType);
Object retVal = generic.Invoke(this, new object[] { attribute, parseObject });
1 голос
/ 17 июня 2010

Вы должны использовать отражение:

Type runtimeType = //get the type
MethodInfo method = typeof(MyClass).GetMethod("GetComparisonObject").MakeGenericMethod(runtimeType);
object returnValue = method.Invoke(null, new object[] { attribute, parseObject });

Тем не менее, важно отметить, что этот подход отбрасывает всю ценность дженериков.Как вы можете видеть выше, результатом вызова метода является object, и так как мы не знаем тип во время компиляции, мы не можем получить какую-либо проверку типа.Если вы не знаете тип во время компиляции, нет смысла использовать универсальный метод.

...