1 – 在基类上使用属性:
public abstract class Parent { public abstract TypeOfObject TypeOfObject { get; }}public class Child1 : Parent{ public overrIDe TypeOfObject TypeOfObject { get { return TypeOfObject.Child1 } } // ...}public class Child2 : Parent{ public overrIDe TypeOfObject TypeOfObject { get { return TypeOfObject.Child2 } } // ...}public enum TypeOfObject { Child1,Child2}public static voID Main(){ Parent p = new Child1(); switch (p.TypeOfObject) { case TypeOfObject.Child1: _doSomethingWithChild1(p);break; case TypeOfObject.Child2: _doSomethingWithChild2(p);break; }}
2 – 使用is运算符
public abstract class Parent { // ...}public class Child1 { // ...}public class Child2 : Parent{ // ...}public enum TypeOfObject { Child1,Child2}public static voID Main(){ Parent p = new Child1(); if (p is Child1) _doSomethingWithChild1(p); if (p is Child2) _doSomethingWithChild2(p);}
每种选择的含义是什么?我认为2由于依赖于元数据而具有更大的性能,但是1似乎不那么优雅.此外,我学会了用C语言中的1个方法…我不确定是否有必要用C#这样做.
编辑1:
我已将overrIDe关键字添加到上面的代码中.
编辑2:
对不起,我可能没说清楚.我会更好地说明一下:
例如,我有一个WPF Panel对象,它有一个Children属性,它返回UIElements.我需要知道某个元素在什么类型上行动…在我的特定情况下,用户在屏幕上绘制图形,所以我需要知道有多少节点和多少个连接被绘制以便存储然后在数据库.不幸的是,我不能使用多态性,对吗?我怎么知道是否应该在我的节点表或连接表中添加一行?
解决方法 您的使用示例是错误的(正如其他人所说的那样 – 使用多态)但是询问对象的类型是合理的.我问过c Testing a c++ class for features的类似问题
关于#1和#2之间的区别.两者都需要元数据如果您正在使用案例1,则在案例2中您仍在使用CLR生成的元数据. CLR可能比你更好,而且无论如何它支付了开销
一如既往 – 如果你想知道哪个更快,答案很简单 – 测量并查看.我怀疑是否存在可衡量的差异
总结以上是内存溢出为你收集整理的c# – 确定对象的类型全部内容,希望文章能够帮你解决c# – 确定对象的类型所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)