Вернуть упакованный объект обратно к исходному типу

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

Основная проблема заключается в том, что у меня есть общий объект, передаваемый через EventHandler , который блокирует объект и скрывает истинный тип; только во время выполнения я узнаю, что это за объект.

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

РЕДАКТИРОВАТЬ: Идея состоит в том, чтобы иметь возможность определить истинный тип объекта в параметре метода, а затем приведите этот объект к истинному типу, не зная об этом заранее. Это всего лишь упрощенный пример. «Коробка», возможно, был неправильным термином.

Пример:

public class Program
{
    static void Main(string[] args)
    {
        var container = new Container<Containee>(
            new Containee
            {
                Property1 = Guid.NewGuid(),
                Property2 = "I'm a property!",
                Property3 = DateTime.Now
            }
        );

        var boxed = (object)container;

        var originalType = boxed.GetType();

        // DOES NOT COMPILE: would like an operation like this
        // EDIT: Request for more detail
        var actualType = boxed as originalType;
        actualType.Entity.Property2 = "But I like this better.";
    }
}

public class Containee
{
    public Guid Property1 { get; set; } 
    public string Property2 { get; set; }
    public DateTime Property3 { get; set; }
}

public class Container<T>
{
    public Container(T entity)
    {
        Entity = entity;
    }

    public T Entity { get; internal set; }
}

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

Я ожидаю, что есть что-то простое, что я не замечаю, или лучше способ обойти это в целом. Дело в том, чтобы можно было обернуть любой объект в контейнер и позже выяснить, что это было.

11
задан falquan 10 June 2011 в 02:07
поделиться