基本的问题是,我有一个通用的对象被传递通过一个EventHandler,该对象框对象并模糊真实的类型;只有在运行时我知道什么是对象.
诚然,动态关键字可以解决这个问题,但如果我能避免,我不想失去智能感知和一切.另外,它不解决不知道通用对象的每个属性没有大量的反射.
编辑:这个想法是能够在方法参数中确定一个对象的真实类型,然后将该对象转换为真实类型,而不需要事先知道该对象.这只是一个简化的例子.盒装可能是错误的术语.
一个例子:
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; } }
显然不会编译,因为没有一种方法可以转换为变量.但是,我希望有一种方式来获得对实际对象和类型的引用,或至少是一种动态重新创建类型的方法.
我期望有一些简单的我俯瞰,或更好的方式来摆脱它.关键是能够将任何对象包装在容器中,然后再解释它是什么.
解决方法
The idea is to be able to determine the true type of the an object in a method parameter
这很简单(你已经在做)
Type actualType = param.GetType();
这将使您获得对象的实际具体类型
and then cast that object as it’s true type
这是事情从轨道上脱落的地方. C#中的转换操作符(用户称之为“投射”)可以做两件事情:
>使用类型特定的显式转换通过将转换应用于现有对象来创建新对象(请注意,这是创建的新引用;原始对象的类型永远不会更改)
>允许开发人员将对象引用为与继承层次结构不同级别的类型(或者层次结构中低于当前引用的类型实现的接口)
在你的情况下,第一个选择是正确的;像所有运算符一样,转换运算符不是多态的.也就是说,只有在被引用的类型上定义了操作符,而不是被引用的对象时,才应用操作符.如果你想进一步澄清这一点,让我知道,但我不认为这是你的问题的一个关键,所以我不会进一步去,除非问.
第二个选项是可以实际应用于您的唯一选项,但请考虑以下两个原因:
>所以你可以将对象引用为一个比当前提供的具体类型更低的特定类型(在你的情况下,你的对象是一个对象,所以这几乎是一样高)
>因此,您可以将对象引用为层次结构中较高的对象,以便绕过隐藏(但不被覆盖)成员.
(绝大多数演员是为了理由#1)
您要使用这些选项之一的原因是,您可以使用强类型对象并使用该类型定义的各种成员.但是,所有这些都只适用于您在编写代码时知道的类型.在编译时将其转换为未知的类型是没有意义的,因为转换不会对实际对象执行任何操作(它仍然是它的真实类型;唯一改变的类型是引用对象的变量).
如果您可以提供一个进一步详尽的例子,说明您实际想要做的事情(完整的代码,如您所希望或期望的工作),我可能可以提供一些建模更接近你的东西想要,但正如它所描述的那样,就像我能得到的一样.