c# – 铸造盒子回到原始类型

我期望有两个答案之一,不可能或非常简单,我忽略了明显的Google查询.

基本的问题是,我有一个通用的对象被传递通过一个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)

您要使用这些选项之一的原因是,您可以使用强类型对象并使用该类型定义的各种成员.但是,所有这些都只适用于您在编写代码时知道的类型.在编译时将其转换为未知的类型是没有意义的,因为转换不会对实际对象执行任何操作(它仍然是它的真实类型;唯一改变的类型是引用对象的变量).

如果您可以提供一个进一步详尽的例子,说明您实际想要做的事情(完整的代码,如您所希望或期望的工作),我可能可以提供一些建模更接近你的东西想要,但正如它所描述的那样,就像我能得到的一样.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


原文地址:http://msdn.microsoft.com/en-us/magazine/cc163791.aspx 原文发布日期: 9/19/2005 原文已经被 Microsoft 删除了,收集过程中发现很多文章图都不全,那是因为原文的图都不全,所以特收集完整全文。 目录 前言 CLR启动程序
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采纳和使用,它的确提供了很多的优势也解决了很多的问题,但是我们也知道也并不是银弹,提供优势的同时它也给我们的开发人员和团队也带来了很多的挑战。 为了迎接或者采用这些新技术,开发团队需要更加注重一些流程或工具的使用,这样才能更好的适应这些新技术所
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下PLINQ中的分区。上一篇介绍了并行编程,这边详细介绍一下并行编程中的分区和自定义分区。 先做个假设,假设我们有一个200Mb的文本文件需要读取,怎么样才能做到最优的速度呢?对,很显然就是拆分,把文本文件拆分成很多个小文件,充分利用我们计算机中
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Microsoft为了利用这个硬件特性,于是在Visual Studio 2010 和 .NET Framework 4的发布及以上版本中,添加了并行编程这个新特性,我想它以后势必会改变我们的开发方式。 在以前或者说现在,我们在并行开发的时候可
c语言输入成绩怎么判断等级
字符型数据在内存中的存储形式是什么
c语言怎么求字符串的长度并输出
c语言函数的三种调用方式是什么
c语言中保留两位小数怎么表示
double的输入格式符是什么
长整型输出格式是什么
C语言中文件包含的命令关键字是什么
c程序如何编写x的y次方
c语言开根号代码是什么
c语言怎么进行字符串比较
c语言怎么进行强制类型转换
c语言运算符的优先级顺序是什么
c++用什么软件编程
中序遍历是怎么遍历的
h文件和c文件的关系是什么