类型是编译器识别的东西,如果你在写代码的时候知道类型,或者类型的基类,你可以直接用as或强制类型转换
比如
object o = 32;
IConverable c = o as IConvertable;
or
int c = (int)o;
如果这个类型在你写程序的时候没有,只好一直用反射了。在语法上你没有办法用一个类型和它关联。不过你可以用dynamic,其实它相当于反射,不过编译器不会检查这个对象是否合法,直接编译,比如
object o = new { id = 1, name = "a" };
dynamic d = o;
int i = d.id; // right
d.id = 3; // wrong, because its readonly
d.abcd = "aaa"; // wrong, not such a property
注意这些错误只能运行的时候发现。使用dynamic可以绕过编译器检查。
你也可以结合两者访问集合,比如
object o = ...;
foreach (dynamic d in o as IEnumerable)
{
Console.WriteLine(d.Name);
}
(前提是o本身是一个List<T>)
比如
object o = 32;
IConverable c = o as IConvertable;
or
int c = (int)o;
如果这个类型在你写程序的时候没有,只好一直用反射了。在语法上你没有办法用一个类型和它关联。不过你可以用dynamic,其实它相当于反射,不过编译器不会检查这个对象是否合法,直接编译,比如
object o = new { id = 1, name = "a" };
dynamic d = o;
int i = d.id; // right
d.id = 3; // wrong, because its readonly
d.abcd = "aaa"; // wrong, not such a property
注意这些错误只能运行的时候发现。使用dynamic可以绕过编译器检查。
你也可以结合两者访问集合,比如
object o = ...;
foreach (dynamic d in o as IEnumerable)
{
Console.WriteLine(d.Name);
}
(前提是o本身是一个List<T>)
解决方案 »
- 问一个HTTPWebRequest的问题,略显诡异
- winform 从listbox中删除一个项
- 求一个正则表达式:匹配包含任意字母、数字、加减乘除、下划线的字符串,但不包含纯数字 或 由数字和减号组成的字符串
- 如何在C#写的dll文件中加入javascript语言啊?
- 100分C# .NET高手快来帮下小弟吧,不胜感激
- 如何去除这个抛出异常?
- 请问如何获取 98 系统的 MAC ??????????????????????????
- 高手请进:对比Java,对C#基本数据类型和系统类型的疑问(如, int 和 System.Int32)
- ListBox中历史上最难的问题,大哥们救救小第把
- 关于在dataGridView中对Cell赋值的问题!
- 怎样判断Winform窗体内的值是否变化
- 从字符串转换日期和/或时间时 转换失败。
虽然返回的是object,但是实际引用一直是Type对象所描述的类型对象。故在属性赋值时,只要object的实际引用的类型和属性的类型兼容(as 转换可成功,或者实现了转换重载等),必然会赋值成功。实际上,你只需要System.Activator.CreateInstance(p.PropertyType),这样保证你赋值成功,记住,就目前来说,除非微软更新,否则永远不要考虑题目中的问题。
Type ty= obj.GetType();
if (ty.Name.Equals("Form1"))
{
Form1 f = (Form1)obj;
}