对象类型可以作为动态类型

时间:2015-12-16 06:05:35

标签: c# .net object dynamic clr

我的课程定义如下:

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();

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

debug mode

这是我的怀疑; 对象是否具有动态行为

2 个答案:

答案 0 :(得分:1)

  

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

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

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

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

但具体来说:

  

对象是否具有动态行为?

不,他们没有。除非您通过DynamicObject使用dynamic之类的内容,但这只是完全不同的乐趣

答案 1 :(得分:-1)

答案是否定的,不应该

object obj = new Foo()

表示将Foo实例转换为“对象”类型引用。

你现在正在反对一个“对象”。在你明确地把它扔掉之前不要跟狗。

e.g。

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

考虑为什么动物实例没有名为Bark()/ Fly()的行为在您使用Animal实例时完全不合逻辑。