2012-04-10 1 views
10

Я пытаюсь сделать что-то вроде этого:Как распаковывать в C# объект динамического типа

void someMethod(TypeA object) { ... } 

void someMethod(TypeB object) { ... } 

object getObject() 
{ 
    if (...) return new TypeA(); 
    else return new TypeB(); 
} 

object obj = getObject(); 
(obj.GetType()) obj; // won't compile 
someMethod(obj); 

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

if (obj.GetType() == typeof(TypeA)) obj = (TypeA)obj; 
else if (obj.GetType() == typeof(TypeB)) obj = (TypeB)obj; 

- но не есть какой-то способ сделать это во время выполнения?

EDIT Я согласен, что это, пожалуй, не лучший выбор дизайна, так что вот контекст. Точкой вышеописанного кода является базовый класс репозитория для Mongo DB. Я хочу, чтобы он мог обрабатывать различные типы таблиц. Итак, someMethod() на самом деле удалить; и TypeA и TypeB: ObjectID и Guid; код внизу является частью типа-агностик удаляет метод, который принимает идентификатор в виде строки; и getObject() - это метод для анализа параметра ID.

+0

Вы приравнивая типа 'T' с информацией типа выполнения, связанные с ним:' TYPEOF (Т) '. Они не одно и то же и не могут быть заменены друг на друга. –

+0

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

+0

@Kirk Woll, я знаю разницу, я просто хотел проиллюстрировать то, что я пытался сделать. – McGarnagle

ответ

20

Если вы используете .NET 4 и C# 4, вы можете использовать dynamic для этого:

dynamic obj = GetObject(); 
SomeMethod(obj); 

В противном случае, вам придется использовать отражение, чтобы найти и вызвать правильный метод. Разрешение перегрузки (для типов не dynamic) выполняется по адресу компиляция -time.

(Обратите внимание, что если TypeA и TypeB не являются структурами, вы бы не распаковка все равно ...)

+0

или 'obj.SomeMethod()'? –

+0

@RobertHarvey: Не задан способ написания вопроса, где он выбирает перегрузки в одном и том же типе. –

+0

Ницца !! Именно то, что я искал, спасибо. – McGarnagle