首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

动态的把Object对象拆箱类型转换成原来的类对象,请问达人

2012-01-06 
动态的把Object对象拆箱类型转换成原来的类对象,请教达人动态的把Object对象类型转换成原来的类对象,如何

动态的把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();    }} 

热点排行