社区
C#
帖子详情
能从一个Type继承吗?
北京的雾霾天
2012-09-11 08:43:50
从一个类型继承出另一个类型大家都知道怎样写,比如:
class A
{
}
class B:A
{
}
这个代码中B继承了A,A是B的基类,可是,如果A是一个反射出来的类型,那么B怎样继承?
Type type=typeof(A);
class B:type???
{
}
...全文
378
25
打赏
收藏
能从一个Type继承吗?
从一个类型继承出另一个类型大家都知道怎样写,比如: class A { } class B:A { } 这个代码中B继承了A,A是B的基类,可是,如果A是一个反射出来的类型,那么B怎样继承? Type type=typeof(A); class B:type??? { }
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
victo7
2012-09-12
打赏
举报
回复
ILGenerator类的Emit方法的确可以干这个事情。
都知道.NET代码要经过两次编译才能最终执行。
ILGenerator类的Emit做的就是把 动态生成的代码 注入到IL中,接下来的事情就水到渠成了。
动态生成的代码就是像LZ这种需求:运行时才能得到基类(事先知道基类的话,那就直接继承了),然后根据基类得到子类。代码要执行需要编译,编译的结果就是IL代码,运行时生成的代码代码字符串,如何运行,那就必须转成IL能读懂的字符串。即IL代码,ILGenerator类的Emit做的就是替我们生成IL代码。
你们是不是在找BUG
2012-09-12
打赏
举报
回复
type是变量,也不是类型吧
zhujiawei7
2012-09-12
打赏
举报
回复
LZ在想啥,继承是通过代码编程实现的。
难道你打算通过反射,让2个本没关系的类,发生关系吗?
zhujiazhi
2012-09-12
打赏
举报
回复
动态编译就可以的,只是调用这个类的方法属性都要通过反射的,
简单的示例
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
CompilerParameters loParameters = new CompilerParameters();
loParameters.GenerateInMemory = true;
loParameters.ReferencedAssemblies.Add("System.dll");
loParameters.ReferencedAssemblies.Add("System.Data.dll");
loParameters.ReferencedAssemblies.Add("System.XML.dll");
CompilerResults result = CodeDomProvider.CreateProvider("CSharp").CompileAssemblyFromSource(loParameters, GenerateCodeBlocks());
if (result.Errors.HasErrors)
{
foreach (CompilerError error in result.Errors)
{
Console.WriteLine(error.ErrorText);
}
}
else
{
DataSet ds = new DataSet();
Assembly assembly = result.CompiledAssembly;
double calculated = Convert.ToDouble(assembly.GetType("demo.calculation").GetMethod("dowork").Invoke(null, new object[] { ds }));
Console.WriteLine(calculated);
}
//反射出来的一个类
static string GenerateCodeBlocks()
{
string code =
"using System;using System.Data;" +
"namespace demo" +
"{" +
"public static class calculation" +
"{" +
"public static double dowork(DataSet ds)" +
"{ return 1;}}}";
return code;
}
真相重于对错
2012-09-11
打赏
举报
回复
msdn search emit
cheng2005
2012-09-11
打赏
举报
回复
[Quote=引用 9 楼 的回复:]
这个问题已从设计角度解决了。
现在只从技术上来说,我觉得也是可以实现的,但一时没有时间来研究。希望回贴的人当中有一个人能把这300分一次都拿走,当然是解决了贴子中的问题。
[/Quote]
如果晚上有时间我试试,估计可行。但是因为是动态编译,所以使用者也需要动态编译,不然只能是反射调用。
这里面不了解你的需求,所以使用者这块不好确定怎么来弄。
北京的雾霾天
2012-09-11
打赏
举报
回复
这个问题已从设计角度解决了。
现在只从技术上来说,我觉得也是可以实现的,但一时没有时间来研究。希望回贴的人当中有一个人能把这300分一次都拿走,当然是解决了贴子中的问题。
SQL77
2012-09-11
打赏
举报
回复
一定要继承么?
可否用组合方式
Class B
{
直接把A类型的反射和调用等放这里面。
}
快溜
2012-09-11
打赏
举报
回复
如一楼所说,继承是设计,反射式运行时。你可以试用类中类。
cheng2005
2012-09-11
打赏
举报
回复
[Quote=引用 5 楼 的回复:]
我有一个.net的DLL,里面定义了一个抽像的基类,这个类需要被继承后才能调用。
然后这个DLL不能正常的被引用,只能通过Assembly.Load方法来加载,那么这个DLL中的类型怎样被继承又怎样重写基类的方法呢?
如果能直接引用就可以编写它的代码了,可是现在是Load的后期加载。怎么继承这个类型?
其实这不是怪异的想法。
如果是一个DLL被加密,加密后只能通过Load来加载,……
[/Quote]
动态编译。
北京的雾霾天
2012-09-11
打赏
举报
回复
我有一个.net的DLL,里面定义了一个抽像的基类,这个类需要被继承后才能调用。
然后这个DLL不能正常的被引用,只能通过Assembly.Load方法来加载,那么这个DLL中的类型怎样被继承又怎样重写基类的方法呢?
如果能直接引用就可以编写它的代码了,可是现在是Load的后期加载。怎么继承这个类型?
其实这不是怪异的想法。
如果是一个DLL被加密,加密后只能通过Load来加载,问题就出现了。
天下如山
2012-09-11
打赏
举报
回复
还是使用接口吧。
shizhu820228
2012-09-11
打赏
举报
回复
听听别人怎么说
bdmh
2012-09-11
打赏
举报
回复
这也不行,type是动态得知的
cheng2005
2012-09-11
打赏
举报
回复
继承是设计时概念,反射是运行时概念。
怪异的需求产生怪异的设计。
种草德鲁伊
2012-09-11
打赏
举报
回复
动态代理不就是了
qldsrx
2012-09-11
打赏
举报
回复
[Quote=引用 5 楼 的回复:]
我有一个.net的DLL,里面定义了一个抽像的基类,这个类需要被继承后才能调用。
然后这个DLL不能正常的被引用,只能通过Assembly.Load方法来加载,那么这个DLL中的类型怎样被继承又怎样重写基类的方法呢?
如果能直接引用就可以编写它的代码了,可是现在是Load的后期加载。怎么继承这个类型?
其实这不是怪异的想法。
如果是一个DLL被加密,加密后只能通过Load来加载,……
[/Quote]
希望你可以从我13、14楼给的示例代码得到启发,并自行完成动态加载的代码,技术上面来说,从我给的示例代码已经完全涵盖了你这里所说的需求,可行且只有此法可行,就看你的悟性了。
devmiao
2012-09-11
打赏
举报
回复
我觉得lz应该把关注点放在DLR上面。
既然IronPython、IronRuby可以实现运行时解释脚本并且可以继承静态的类,那么一定有它的办法。
youzelin
2012-09-11
打赏
举报
回复
楼主很扯,一个是运行时动态的获取东西,一个是设计时静态的语法。两个都不是一回事。
victo7
2012-09-11
打赏
举报
回复
stringbuilder classCode = string.format(" public class className : {0}{ //类中的其他代码 }",typof something)
加载更多回复(5)
【BAT面试题典】子类可以
继承
到父类上的注解吗?
子类重写父类方法后,可以
继承
方法上的注解吗? 这个不急,让我来分析一下,假设有如下注解: 定义被注解的类 子类直接
继承
父类 获取父子类和方法的注解信息,并输出注解的value属性的值 日志输出 ...
C++类体系中,不能被派生类
继承
的有?
C++类体系中,不能被派生类
继承
的有? 构造函数不能被
继承
,...为什么C++赋值运算符重载函数不能被
继承
? 这个问题曾经困扰过我一阵子。请先看一下下面的源代码: class A1 { public: int perator=(int a) ...
@annotation 注解的
继承
注解
继承
分为两种情况: 按照Element
Type
区分, 一类是
Type
(class, interface), 另一类是其他(method等) 在后一类, 注解在方法和属性上时, 无论怎样都会被子类或子接口
继承
, 除非子类或子接口重写. 而在
Type
上时, 只有...
Java注解的
继承
1、首先要想Annotation能被
继承
,需要在注解定义的时候加上@Inherited,并且如果要被反射应用的话,就需要还有个事@Retention(RetentionPolicy.RUNTIME)标识 2、JDK文档中说明的是:只有在类上应用Annotation才能被...
CSS中的那些属性是可以
继承
的?
每
一个
css属性定义的概述都指出了这个属性是默认
继承
的,还是默认不
继承
的。这决定了当你没有为元素指定值时该如何计算。 当元素的
一个
继承
属性没有指定值时,则取父元素的同属性的计算值。如果文档根元素没有设置值...
C#
110,537
社区成员
642,576
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章