反射,类型XX对象无法转换为类型XX,XX是一样的

yjyqghd 2007-11-14 10:39:45
出错提示:

类型“NekoNH.Data.RootSort”的对象无法转换为类型“NekoNH.Data.RootSort”。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.ArgumentException: 类型“NekoNH.Data.RootSort”的对象无法转换为类型“NekoNH.Data.RootSort”。

源错误:


行 108: Response.Write("<br>");
行 109:
行 110: pInfo.SetValue(obj, value, null);
行 111:
行 112:

源代码:
protected void NekoDetailsView1_ItemInserting(object sender, DetailsViewInsertEventArgs e)
{
RootSort trs = (RootSort)BLLRootSort.SelectRecord(rootSort);
RootSort rs = new RootSort();
rs.CopyFromWithId(trs);

string NHpath = string.Format("{0}", Server.MapPath("~/bin/NekoNH.Data.dll"));
string NHname = string.Format("NekoNH.Data.{0}",rs.ClassName);

//装载类
Assembly assembly = Assembly.LoadFile(NHpath);
//获得类型
Type NHt = assembly.GetType(NHname);
//实例化一个新类
Object obj = Activator.CreateInstance(NHt);

//给实例化类的属性设置值


//类别名称
SetPropertyInfo(obj, "Name",((TextBox)NekoDetailsView1.FindControl("TextBox_Name")).Text);

//类名称
SetPropertyInfo(obj, "ClassName", rs.ClassName);

//顺序
SetPropertyInfo(obj, "Sequence",Convert.ToInt32(((TextBox)NekoDetailsView1.FindControl("TextBox_Sequence")).Text));

//是否启用
SetPropertyInfo(obj, "IsPublic", ((CheckBox)NekoDetailsView1.FindControl("CheckBox_IsPublic")).Checked);

//备注
SetPropertyInfo(obj, "Remark", ((TextBox)NekoDetailsView1.FindControl("TextBox_Remark")).Text);


//父类别
SetPropertyInfo(obj, "ParentSort", rs);
//SetPropertyInfo(obj, "ParentSort", BLLRootSort.SelectRecord(Convert.ToInt16(TreeSort1.Value)));

//Response.Write(pInfo.GetValue(obj, null));


//e.Values["ParentSort"] = BLLRootSort.SelectRecord(0);


//WebMethod.ShowMessage("添加数据成功。");
e.Cancel = true;
}
/// <summary>
/// 设置对象属性的值
/// </summary>
/// <param name="obj">对象</param>
/// <param name="name">属性名称</param>
/// <param name="value">object值</param>
protected void SetPropertyInfo(object obj, string name,object value)
{
Type t = obj.GetType();
PropertyInfo pInfo = t.GetProperty(name);



Response.Write("pInfo " + pInfo.GetType());
Response.Write("<br>");
Response.Write("pInfo " + t.GetType());
Response.Write("<br>");
Response.Write("value " + value.GetType());
Response.Write("<br>");
Response.Write("<br>");

pInfo.SetValue(obj, value, null);


}

类的关系:



RootSort类

private int _id;
/// <summary>
/// 类别名称
/// </summary>
private string _name;
/// <summary>
/// 父类名称
/// </summary>
private string _className;
/// <summary>
/// 顺序
/// </summary>
private int _sequence;
/// <summary>
/// 是否启用
/// </summary>
private bool _isPublic;
/// <summary>
/// 备注
/// </summary>
private string _remark;
/// <summary>
///
/// </summary>
private RootSort _parentSort;
/// <summary>
///
/// </summary>
private IList<RootSort> _parentSortRootSorts;

NewsSort类继承RootSort类

CallingSort类继承RootSort类


...全文
611 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
19811104 2011-06-01
  • 打赏
  • 举报
回复
感谢很多高手给我的提示,谢谢,十分感谢!!!
iyooepng 2010-11-30
  • 打赏
  • 举报
回复
自己解决了,尝试之中,还有种错误是报

//反射,类型XX对象无法转换为类型XX,XX是一样的


其实都很好办,把需要类型单独出来成一个类库,就可以了
花了我近三天的时间啊,还好,总算解决了,留个回复给需要的兄弟
iyooepng 2010-11-30
  • 打赏
  • 举报
回复
遇到同样的问题,楼主有没有解决啊?
chuxue1342 2007-11-15
  • 打赏
  • 举报
回复
MARK
danjiewu 2007-11-15
  • 打赏
  • 举报
回复
Assembly assembly = Assembly.LoadFile(NHpath);
这里有问题。既然你Assembly文件都写死了,那为什么还要通过反射加载呢,还不如直接添加引用。
何况即使要用Assembly.LoadFile也不应该写在ItemInserting这种反复发生的事件里。
如果还是一定要用反射加载,用Assembly.LoadFrom试试。
真相重于对错 2007-11-15
  • 打赏
  • 举报
回复
你通过Assembly.load的assembly

RootSort trs = (RootSort)BLLRootSort.SelectRecord(rootSort);
trs所在的程序集是不同的程序集
所以虽然二者具有相同类型名称但无法转化

110,536

社区成员

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

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

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