日期:2014-05-18  浏览次数:20898 次

动态的把Object对象拆箱类型转换成原来的类对象,请教达人
动态的把Object对象类型转换成原来的类对象,如何做。
看官是有潜水资历的达人,看了标题大概就会说:哦,是曾相识的问题么。请不吝赐教。

最初的需要是,把一些各种各样的类对象的名字罗列出来。比如,马里叔叔、曾老师、路人甲、Tom猫、宝马汽车、宝马600轿车,class1。它们都有个string类型的name属性(C#叫字段),要是没有name属性就显示类名。但难在不知道准确类型,还允许继续派生、添加其他类型。 所以if(obj is person){...} else if (obj is cat){...}就不能了。 若有个 public static string getObjName( Object obj){???}方法就好了的想。

然后我联想想到装箱和拆箱,正是这个问题:怎么把装箱了的Object对象取出来自动拆箱成原来的类型的对象(可以是副本)呢。

在研究继承关系和多态方法中,有大量的类型转换,转来转去它们都是引用同一个对象(Object.RefernceEquals(cat2, (mammal2)) 显示真), 而且总能得到其原来的类型名( cat2.GetType()和mammal2.GetType()都得extendTest.cat )。
进一步,若是类对象被装相,那自动拆箱过后它还得是引用原本的对象。这就更要请教了。



------解决方案--------------------
//假设有个对象obj,有个字段MyField,通过反射可以拿到
Type t = typeof(obj);
t.InvokeMember("MyField", BindingFlags.Instance | BindingFlags.GetField, null, obj, null);
------解决方案--------------------
最初的需要是,把一些各种各样的类对象的名字罗列出来。

起码这个可以. 上面的不是都说了吗?

 yourClass c = new yourClass();
 Type t = c.GetType();
 object o = t.InvokeMember("name",BindingFlags.GetField, null, c2, null);
 if(o==null)//没有name属性
 {
 c.ToString()直接调他就是输出的类型名
 }
else //有name 显示name
{
}
是这个意思吗?
------解决方案--------------------
定义一个类
C# code

public static class A {
    public static string sayMyName(this object obj) {
      var t = obj.GetType();
      var property = t.GetProperty("Name");
      return property != null ? property.GetValue(obj, new object[] {}).ToString() : obj.ToString();
    }
}