【问题标题】:dynamic casting?动态铸造?
【发布时间】:2009-09-17 07:07:24
【问题描述】:

我需要一种将对象转换为编译器时不知道的类型的方法。

类似这样的:

object obj;

public (type of obj) Obj
{
    get
    {
        return obj
    }
    set
    {
        obj = (type of obj)value;
    }
}

唯一知道的是 obj 是一个值类型。

我怀疑这样的事情是否可行。只是检查一下是否有人有聪明的方法。

【问题讨论】:

  • 泛型?根据 T 定义类似 Indexer 的方法
  • 我编辑了代码以使其更清楚我想要做什么。
  • 在你的例子中,你的演员在 setter 中,而在 getter 中更有意义。

标签: c# dynamic casting


【解决方案1】:

这在 C# 3.0 中是不可能的,但如果您可以定义一个所有对象都实现的通用接口,则可以强制转换为该接口。

在 C# 4.0 中,我们将获得 dynamic 关键字,它允许我们进行 Duck Typing。

【讨论】:

  • 在多个项目中与此类场景作斗争后,我认为拥有一个通用界面可能是最好的方法。根据类型访问它的功能将更倾向于在某个阶段使用开关或某种类型的选择器(那么为什么不从一开始就进行类型转换呢?),毕竟,如果不知道你怎么知道该怎么做访问一次?如果这是某种类似插件的 exec 的一部分,则使用反射并通过访问其方法和属性将消除强制转换的需要,因此是松散耦合的。猜猜这一切都取决于你需要它来做什么
【解决方案2】:

嗯,你可以用泛型做到这一点:

public class IAcceptValueTypes<T> where T: struct

private T obj;

public T Obj
{
    get { return obj; }
    set { obj = value; }
}

通用约束where T: struct 会将可接受的类型限制为值类型。

【讨论】:

    【解决方案3】:

    这样的强制转换实际上不会做任何事情,因为您将 at 分配给具有更宽松类型的变量。您的最佳方法取决于您想在“强制转换”后对值类型做什么。

    选项是:

    • 反射
    • C# 4.0 dynamic 打字。
    • 基于变量类型的简单switchif .. else

    编辑:如果您在编译时对类型一无所知,则使用泛型类实际上并不能解决您的问题,但是您的示例并未说明您的类的实际用法,因此可能是我误解了你的意图。像这样的东西实际上可能是您正在寻找的东西:

    class MyClass<T> where T: struct
    {
        T obj;
    
        public T Obj
        {
            get { return obj; }
            set { obj = value; }
        }
    }
    
    MyClass<int> test = new MyClass<int>();
    test.Obj = 1;
    

    实际类型定义现在在您的类之外,作为泛型类型参数。严格来说,类型仍然是静态的,因为它在编译时是已知的。

    【讨论】:

      【解决方案4】:

      目前我面前没有 Visual Studio 可以试用,但你为什么不查一下:

      • 获取类型
      • Convert.ChangeType

      【讨论】:

        【解决方案5】:

        为什么需要这种类型的选角?

        1. 如果类型数量有限,您可以实现属性的通用版本。
        2. 您可以使用反射来了解传递对象的类型并转换为该类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-21
          • 1970-01-01
          • 1970-01-01
          • 2014-05-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多