关于反射

zhonwei123 2012-04-26 02:33:54
Activator.CreateInstance(t) as T 这个返回来的是NULL是怎么回事了 求解

Assembly assembly = LoadCode(code);
if (assembly == null)
{
return null;
}

//Type[] types = assembly.GetTypes();
Type[] types = assembly.GetTypes();
Type type = typeof(T);
foreach (Type t in types)
{
//if (t.GetInterface(type.Name) == type || t.IsSubclassOf(type))
//{
try
{
var item = Activator.CreateInstance(t) as T;
return item;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
//}
}

整个代码就是这样
...全文
202 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
anzhiqiang_touzi 2012-04-26
  • 打赏
  • 举报
回复


Activator.CreateInstance(typeof(T)) as T


Activator.CreateInstance(t) as T


或者你的t 根本就不是T的类型
feixuyue 2012-04-26
  • 打赏
  • 举报
回复
如果不是类,怎么创建实例
zhonwei123 2012-04-26
  • 打赏
  • 举报
回复
额 不好意思我知道了。。。额 接口需要继承。。。突然提醒到我了。。
cheng2005 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
那应该怎么改了?
@wddw1986 可以告诉我你的联系方式 反射这块我不是很懂
[/Quote]
你不懂的不光是反射,我看你 继承 根本就不懂,接口 估计你也是不懂。
基础差太多了,先学习学习基础去吧,别研究反射了,这东西不适合你现在的知识水平。
zhonwei123 2012-04-26
  • 打赏
  • 举报
回复
那应该怎么改了?
@wddw1986 可以告诉我你的联系方式 反射这块我不是很懂
cheng2005 2012-04-26
  • 打赏
  • 举报
回复
你把RunTo 类型转换成Run,不为null才怪了,这两个东西有毛关系
zhonwei123 2012-04-26
  • 打赏
  • 举报
回复
是接口
  • 打赏
  • 举报
回复
T类型是Run? Interface?
cheng2005 2012-04-26
  • 打赏
  • 举报
回复
自己调试吧,没法帮你了。
只有你自己才知道,这里面的t是什么,Create出来的objcet是什么类型。
Activator.CreateInstance(t)
zhonwei123 2012-04-26
  • 打赏
  • 举报
回复
string code1 = @"using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
public class RunTo
{
public void Write()
{
Console.WriteLine(""123"");
}
}
}";

这是我要编译的code
zhonwei123 2012-04-26
  • 打赏
  • 举报
回复
话说我T类型的东西也是没问题的。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
public interface Run
{
void Write();
}
}
cheng2005 2012-04-26
  • 打赏
  • 举报
回复
看好,使用指定类型的默认构造函数来创建该类型的实例。看看你的T类型的无参构造函数去吧。

//
// 摘要:
// 使用指定类型的默认构造函数来创建该类型的实例。
//
// 参数:
// type:
// 要创建的对象的类型。
//
// 返回结果:
// 对新创建对象的引用。
//
// 异常:
// System.ArgumentNullException:
// type 为 null。
//
// System.ArgumentException:
// type 不是 RuntimeType。- 或 -type 是一个开放式泛型类型(即,System.Type.ContainsGenericParameters
// 属性返回 true)。
//
// System.NotSupportedException:
// type 不能为 System.Reflection.Emit.TypeBuilder。- 或 -不支持创建 System.TypedReference、System.ArgIterator、System.Void
// 和 System.RuntimeArgumentHandle 类型或者由这些类型组成的数组。- 或 -包含 type 的程序集是动态程序集,使用
// System.Reflection.Emit.AssemblyBuilderAccess.Save 创建。
//
// System.Reflection.TargetInvocationException:
// 被调用的构造函数引发异常。
//
// System.MethodAccessException:
// 调用方没有调用此构造函数的权限。
//
// System.MemberAccessException:
// 无法创建抽象类的实例,或者用后期绑定机制调用了该成员。
//
// System.Runtime.InteropServices.InvalidComObjectException:
// COM 类型不是通过 Overload:System.Type.GetTypeFromProgID 或 Overload:System.Type.GetTypeFromCLSID
// 获得的。
//
// System.MissingMethodException:
// 找不到匹配的公共构造函数。
//
// System.Runtime.InteropServices.COMException:
// type 是一个 COM 对象,但用于获取类型的类标识符无效,或被标识的类未注册。
//
// System.TypeLoadException:
// type 不是有效的类型。
[SecuritySafeCritical]
public static object CreateInstance(Type type);
zhonwei123 2012-04-26
  • 打赏
  • 举报
回复
额 这个还真是自己写的。因为他只有一个 第一个还真是我要的
qldsrx 2012-04-26
  • 打赏
  • 举报
回复
 Activator.CreateInstance(typeof(T)) as T

你要这么写才行,你创建的根本不是T类型的对象,怎么可以转换为T?
cheng2005 2012-04-26
  • 打赏
  • 举报
回复
自己写的就更有意思了,你知道你的代码执行过程是什么吗?
foreach (Type t in types)
然后
var item = Activator.CreateInstance(t) as T;
return item;
遍历到第一个元素就return了。types的第一个元素是你想要的吗?

这种明显的逻辑问题我觉得作为一个程序员要是自己不能发现就太悲哀了。
zhonwei123 2012-04-26
  • 打赏
  • 举报
回复
额 自己写的 哪里有问题了。。指教。。
cheng2005 2012-04-26
  • 打赏
  • 举报
回复
逻辑就有问题,很明显这是楼主Copy过来的代码,然后发现,哎呦,怎么不对呢,然后就慌了。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧