【问题标题】:Unboxing an Object type to a primitive and other types (simulating late-binding)将 Object 类型拆箱为原始类型和其他类型(模拟后期绑定)
【发布时间】:2010-10-11 02:18:35
【问题描述】:

我有一个类,其中包含每个原始类型、字符串和 INetSerializable 的类 Append 成员:

   public class TypeAppender
   {
         public void Append(int i ) {}
         public void Append(double d) {}
         public void Append(string s){}i){}
         public void Append(INetSerializable ins){}
    }

从另一个类,我想通过传递 Object 来“笼统地说”这个方法

说我有类似的东西:

class SomeClientClass
{
    TypeAppender _appender=new TypeAppender ();  
    Dictionary<string, Object> _cmdTable =new Dictionary<string, Object>();   

    public void Process()
    {   
        foreach(KeyValuePair<string, Object> pair in cmdTable )   
        {
              _appender.Append(pair.Key);

              Object obj = pair.Value;
              if (obj is int)
                 _appender..Append((int)obj);
              else if (obj is double)
                 _appender..Append((double)obj);
              else if (obj is char)
                 _appender..Append((char)obj);
              else if (obj is string)
                 _appender..Append((string)obj); 
        }
    }     
    public void AddParam<T>(string key, T value)
    {
            _cmdTable.Add(key, value);
    }
}

问题 #1:pair.Value 是否会被拆箱为正确的原语?

问题 #2: AddParam 成员函数有什么问题吗?

谢谢

【问题讨论】:

    标签: c# .net binding


    【解决方案1】:

    没有。

    使用原样的代码,它将无法编译,因为没有合适的从对象 -> 非对象类型的转换。您必须手动将代码转换为适当的类型。

    一种选择是提供 Object 类型的 Append 的重载并在那里执行逻辑。

    void Append(object obj) {
      if ( obj is int ) {
        Append((int)obj);
      } else if ( obj is double) { 
        Append((double)obj);
      ...
    }
    

    编辑问题 #2

    从某种意义上说它可以正常运行并没有错。但是,它似乎并没有为您的应用程序增加任何价值,而不是拥有一个采用对象参数的非通用应用程序。

    【讨论】:

    • 这会很痛苦。除了您所说的或为每种支持的类型提供不同的字典之外,还有什么好的解决方法吗?
    • @Sasha,很遗憾没有后期绑定机制(VB 或 C# 4.0),这真的是你唯一的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    相关资源
    最近更新 更多