代码之家  ›  专栏  ›  技术社区  ›  Nayan

如何区分SDK类对象和自定义类对象?

  •  0
  • Nayan  · 技术社区  · 16 年前

    要了解我的需求,请考虑这些类-

    class A { }
    
    class B {
        String m_sName;
        public String Name {
            get { return m_sName; }
            set { m_sName = value; }
        }
    
        int m_iVal;
        public int Val {
            get { return m_iVal; }
            set { m_iVal = value; }
        }
    
        A m_objA;
        public A AObject {
            get { return m_objA; }
            set { m_objA = value; }
        }
    }
    

    现在,我需要识别传递给函数的对象的类

    void MyFunc(object obj) {
        Type type = obj.GetType();
    
        foreach (PropertyInfo pi in type.GetProperties()) {
            if (pi.PropertyType.IsClass) { //I need objects only
    
                if (!type.IsGenericType && type.FullName.ToLower() == "system.string") {
                    object _obj = pi.GetValue(obj, null);
                    //do something
                }
            }
        }
    }
    

    我不喜欢这段代码-

        if (!type.IsGenericType && type.FullName.ToLower() == "system.string") {
    

    因为我必须过滤掉类,比如,System.Int16,System.Int32,System.Boolean等等。

    有没有一种优雅的方法可以让我知道对象是否属于我定义的类,而不是系统提供的基本类?

    6 回复  |  直到 16 年前
        1
  •  1
  •   Franci Penov    16 年前

    一种可能的方法是使用 Type.Assembly

        2
  •  1
  •   Darin Dimitrov    16 年前

    其实没有一个可靠的方法。我们想到的一件事是查看定义了给定类型的程序集: type.Assembly 已知

        3
  •  0
  •   Jorge Córdoba    16 年前

    您可以遍历mscorlib.dll中的所有类并将它们放入一个列表中,然后根据该列表检查类名。

        4
  •  0
  •   Mikael Svenson    16 年前

    您可以查看 AssemblyQualifiedName 在类型上 Assembly 财产。但是您必须为运行时的不同版本收集框架使用的不同标记,并与它们进行比较。

        5
  •  0
  •   Christoffer    16 年前

    如果可能的话,最简单的方法是用一个可以检查的属性来标记自己的类(而不是检查泛型和类型名)。

        6
  •  0
  •   Chris C.    14 年前

    我有一个便宜快捷的解决方案,可能会奏效:

    if( type.IsClass && ! type.IsSealed )
    

    String对象是一个类,但它也是针对继承而密封的。只要代码中没有使用密封类,这种方法就可以工作。