如我有以下两个类
class A
{
      protected static string MyGetType()
      {}
}class B : A
{  
}我想在调用B.MyGetType()时,在MyGetType()中获取B的类型,能做到吗?
不要用protected static string MyGetType(Type objType)的方式。

解决方案 »

  1.   

    class A本身是不知道会被那些子类继承的 ,所以不可以静态函数是在编以后就确定地址的,而虚函数是晚邦定的,所以这两方是矛盾的
      

  2.   

    在调用的时候是用子类调用的,即B.MyGetType(),但这个MyGetType是父类的静态函数,有点像
    B.ToString(),虽然ToString()是object的函数,但B调用B.ToString()仍然可以得到B的TypeName,但是怎么实现的我不知道,有一种方式是StackTrace,但是调试的方法,不能用,有没有其它的方法啊?
      

  3.   

    ToString是虚函数,当然可以了,你要的静态函数办不到
      

  4.   

    B.MyGetType()这个方法有什么意义?等于拿着钥匙问别人钥匙在哪里。
    typeof(B).Name不好吗?
      

  5.   

    B.MyGetType()只是举一个例子,实际上我是参考
    http://www.cnblogs.com/smalldust/archive/2007/02/27/384657.html
    想写实现一个EnumClass的基类,只要继承了EnumClass的如PrintType的都成为Enum Class,调用
    PrintType.ToDescList()就可以返回所有枚举属性做为一个IList用于绑定DropDownList之类的,那个ToDescList()做为EnumClass的静态函数,但我调用PrintType.ToDescList()时,ToDescList()内部无法获取调用者的类型,即PrintType内型,所以上来请教,现在看来是没办法了,只好用EnumClassHelper来第三方执行EnumClassHelper.GetDescList(PrintType)这样的形式了,看有没有更好的方法,保留一天,明天再结。
    附EnumClass类和EnumClassHelper类
        /// <summary>
        /// 枚举类,不可声明实例,可追加注释标签
        /// </summary>
        public class EnumClass
        {
            /// <summary>
            ///  枚举类注释标签
            /// </summary>
            public class EnumDescription : Attribute
            {
                string descriptionValue;            public EnumDescription(string description)
                    : base()
                {
                    this.descriptionValue = description;
                }            public string Description
                {
                    get
                    {
                        return descriptionValue;
                    }
                }
            }        private string name;
            public string Name
            {
                get { return name; }
            }        private string desc;
            public string Desc
            {
                get { return desc; }
            }        protected EnumClass() { }        internal EnumClass(string _name, string _desc)
            {
                name = _name;
                desc = _desc;
            }
        }  
        /// <summary>
        /// 枚举类工具类
        /// </summary>
        public class EnumClassHelper
        {
            /// <summary>
            /// 获取枚举类的值集合,EnumClass(Name, Desc)集合
            /// </summary>
            /// <typeparam name="EnumClassType"></typeparam>
            /// <returns></returns>
            public static IList<EnumClass> GetEnumDescList<EnumClassType>()
            {
                Type enumType = typeof(EnumClassType);
                if (!(enumType.BaseType.Name == "EnumClass"))
                {
                    throw new InvalidOperationException("非枚举类要求获取值集合");
                }            FieldInfo[] staticFiles = enumType.GetFields(BindingFlags.Public | BindingFlags.Static);
                IList<EnumClass> list = new List<EnumClass>();
                for (int i = 0; i < staticFiles.Length; i++)
                {
                    object[] attrs = staticFiles[i].GetCustomAttributes(typeof(EnumClass.EnumDescription), true);
                    if (attrs.Length > 0)
                    {
                        EnumClass enu = new EnumClass(((EnumClass.EnumDescription)attrs[0]).Description, staticFiles[i].GetValue(enumType).ToString());
                        list.Add(enu);
                    }
                }
                return list;
            }
        }