Я ожидаю, что есть один из двух ответов на этот вопрос, либо невозможный, либо чрезвычайно простой, и я упустил из виду очевидный запрос 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; }
}
Ясно, что это не будет компилироваться, поскольку на самом деле нет способа преобразовать его в переменную. Однако я надеюсь, что есть способ получить ссылку на реальный объект и тип или, по крайней мере, способ динамически воссоздать этот тип.
Я ожидаю, что есть что-то простое, что я не замечаю, или лучше способ обойти это в целом. Дело в том, чтобы можно было обернуть любой объект в контейнер и позже выяснить, что это было.