求大神指点 :反射创建实现泛型接口的泛型类实例

godshome 2014-06-22 12:20:33
accessdal代码:
namespace accessdal
{
public class SqlHelperX<T>:ISqlHelperX<T>
where T:new ()
{…………}
}

Idal代码就是接口ISqlHelperX<T>
Dal代码:
namespace Dal
{
public static class Factory
{
public static IXhpSqlParam CreateXhpSqlParam()//非泛型,这里没有疑问。
{
return (IXhpSqlParam)Assembly.Load(path).CreateInstance(path + ".XhpSqlParam");
}
public static ISqlHelperX<T> CreateSqlHelperX<T>() //泛型,这里创建出来为null
where T : new()
{
return (ISqlHelperX<T>)Assembly.Load(path).CreateInstance(path + ".SqlHelperX<" + typeof(T).FullName + ">")
}
}


Bll:
 public class SqlHelperX<T>
where T:new()
{
public static bool Insert(T t, string keyName)
{
return Dal.Factory.CreateSqlHelperX<T>().Insert(t, keyName) > 0;
}
}


问题:非泛型Bll.XhpSqlParam.方法()可以顺利调用
泛型 Bll.SqlHelperX<Model.Admin>.Insert(admin) 则在Factor中创建实例时为null
已调式成功可以创建的语句为:
(ISqlHelperX<T>)Assembly.Load(path).CreateInstance(typeof(accessdal.SqlHelperX<T>).FullName)
但那是在快速监示里可行,实际程序中,Factor是不允许访问accessdal层的。所以不知道语句如何去写了
下句是我写的,但创建出为null: 注:path为accessdal
(ISqlHelperX<T>)Assembly.Load(path).CreateInstance(path + ".SqlHelperX<" + typeof(T).FullName + ">")
...全文
303 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcmakebest 2014-06-22
  • 打赏
  • 举报
回复
泛型实例化,楼主参考:
        public static ISqlHelperX<T> CreateSqlHelperX<T>()
               where T : new()
        {
            Assembly a = Assembly.Load(path);
            Type t = a.GetType((path +".SqlHelperX`1");
            Type[] typeArgs = { typeof(T) };
            Type constructed = t.MakeGenericType(typeArgs);
            return (ISqlHelperX<T>)System.Activator.CreateInstance(constructed);
        }
threenewbee 2014-06-22
  • 打赏
  • 举报
回复
Type.MakeGenericType http://msdn.microsoft.com/zh-cn/library/system.type.makegenerictype.aspx
iyomumx 2014-06-22
  • 打赏
  • 举报
回复
引用 2 楼 godshome 的回复:
[quote=引用 1 楼 iyomumx 的回复:] 你先看看 typeof(accessdal.SqlHelperX<T>).FullName 是什么样子的,再和你拼接的字符串比对下
这个我知道可以行,但他的字符串是这样子的:accessdal.SqlHelperX`1[[Model.GoodsCategory, Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] 因为他是泛型,且带版本号,会不会有不确定?[/quote] 你可以用 typeof(T).AssemblyQualifiedName 代替FullName参与拼接
godshome 2014-06-22
  • 打赏
  • 举报
回复
引用 1 楼 iyomumx 的回复:
你先看看 typeof(accessdal.SqlHelperX<T>).FullName 是什么样子的,再和你拼接的字符串比对下
这个我知道可以行,但他的字符串是这样子的:accessdal.SqlHelperX`1[[Model.GoodsCategory, Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] 因为他是泛型,且带版本号,会不会有不确定?
iyomumx 2014-06-22
  • 打赏
  • 举报
回复
你先看看 typeof(accessdal.SqlHelperX<T>).FullName 是什么样子的,再和你拼接的字符串比对下

110,535

社区成员

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

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

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