【问题标题】:is object type can act as dynamic type是对象类型可以充当动态类型
【发布时间】:2016-03-22 04:10:47
【问题描述】:

我有一个类定义如下:

public class Foo
    {
        private int _LengthVar;
        private string _StringVar;
        public string StringVar
        {
            get { return _StringVar; }
            set { _StringVar = value;
            _LengthVar = value.Length;
            }
        }
        public int LengthVar
        {
            get { return _LengthVar; }
        }

    }

我创建了一个 Foo class=>

的对象
 object obj = new Foo();

当我尝试使用obj.StringVar="some val"; 为属性StringVar 分配一些值时,它不会允许;其中((Foo)obj).StringVar = "this is another value"; 是一个有效的分配。 但是当我删除分配并运行程序并使用断点检查时,obj 显示了Foo 类的所有属性。

我的疑惑来了; 对象是否具有动态行为

【问题讨论】:

  • 我不知道你的意思是“对象具有动态行为”,但是调试器(和任何代码)可以很容易地使用GetType 获取对象的类型,并通过反射查看对象的所有信息。 ..
  • 有一个 'dynamic' 关键字允许“动态”行为,但这绝对是一个很少使用的东西,对于普通应用程序考虑永远不要这样做。

标签: c# .net object dynamic clr


【解决方案1】:

但是当我删除分配并运行程序并使用断点检查时,obj 会显示 Foo 类的所有属性。

调试器/IDE 正在检查 实际对象 - 而不是变量。在这种情况下,变量的类型为object;但是它指向的对象:是Foo,一直是Foo,并且永远是Foo。您可以通过以下方式检查:

var typeName = obj.GetType().Name; // Foo, not object

(同样,它查看的是实际对象,而不是类型)

但要具体一点:

对象是否具有动态行为?

不,他们没有。除非你通过dynamic 使用DynamicObject 之类的东西,但这是一个完全不同的乐趣

【讨论】:

    【解决方案2】:

    答案是否定的,不应该

    object obj = new Foo()
    

    意味着您将 Foo 实例转换为“对象”类型的引用。

    而您现在只针对“对象”工作。除非你明确地把它扔回去,否则不要狗。

    例如

    Animal someAnimal = new Dog();
    Animal anotherAnimal = new Bird();
    

    当您使用 Animal 实例时,思考为什么动物实例没有称为 Bark()/Fly() 的行为是完全不合逻辑的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      相关资源
      最近更新 更多