社区
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???
{
}
...全文
427
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)
TS:接口
继承
type
之间的
继承
,&连接 两个必须都满足 |只能满足
一个
,两个不能同时满足
文章讨论了JavaScript中如何使用接口类型合并(如`
type
People1&Person`),指出`People1`和`People2`类型定义有
继承
限制,不能同时包含`name`和`age`属性,导致在尝试合并实例时出现错误。
spring下bean
继承
另
一个
bean导致No qualifying bean of
type
错误。
本文探讨了在Spring框架中,当使用自动扫描时,如何解决因多重
继承
导致的Bean实例化冲突问题。通过示例说明了错误发生的原因,并提供了解决方案,即通过添加primary属性来指定首选Bean。
type
在python中的用法_Python中
type
的用法
本文详细介绍了Python中
type
函数的用法。
type
函数有两种使用方式,
一个
参数时返回对象类型,三个参数时返回类对象。还对比了
type
和isinstance对
继承
关系的处理,阐述了
type
和object的关系,指出
type
类
继承
自object,object的对象创建自
type
。
继承
一个
类的时候报错:The hierarchy of the
type
'Class name' is inconsistent
本文介绍了在开发过程中遇到的类层次不匹配错误及其解决方法。主要原因是集成的类依赖了未引入项目的其他类,例如ServletRequest。解决方案是在pom.xml文件中添加相应的支持包。
如何知道
一个
类都实现了哪些接口和从那个类
继承
(C#)
博客介绍了C#中类的
继承
情况,包括从
一个
类
继承
、从
一个
或多个接口
继承
、从
一个
类和
一个
或多个接口
继承
。还提到使用
Type
类的Base
Type
属性获取类
继承
的类,用GetInterfaces方法获取类实现的接口,并给出了测试代码,在winform下显示调用。
C#
111,129
社区成员
642,535
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章