导航
  • 主页
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm
  • WPF
  • 问答

能从一个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???
{
}
...全文
326 点赞 收藏 25
写回复
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
victo7 2012-09-12
ILGenerator类的Emit方法的确可以干这个事情。
都知道.NET代码要经过两次编译才能最终执行。

ILGenerator类的Emit做的就是把 动态生成的代码 注入到IL中,接下来的事情就水到渠成了。

动态生成的代码就是像LZ这种需求:运行时才能得到基类(事先知道基类的话,那就直接继承了),然后根据基类得到子类。代码要执行需要编译,编译的结果就是IL代码,运行时生成的代码代码字符串,如何运行,那就必须转成IL能读懂的字符串。即IL代码,ILGenerator类的Emit做的就是替我们生成IL代码。
回复
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;
}
回复
msdn search emit
回复
cheng2005 2012-09-11
[Quote=引用 9 楼 的回复:]

这个问题已从设计角度解决了。
现在只从技术上来说,我觉得也是可以实现的,但一时没有时间来研究。希望回贴的人当中有一个人能把这300分一次都拿走,当然是解决了贴子中的问题。
[/Quote]
如果晚上有时间我试试,估计可行。但是因为是动态编译,所以使用者也需要动态编译,不然只能是反射调用。
这里面不了解你的需求,所以使用者这块不好确定怎么来弄。
回复
这个问题已从设计角度解决了。
现在只从技术上来说,我觉得也是可以实现的,但一时没有时间来研究。希望回贴的人当中有一个人能把这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]
动态编译。
回复
我有一个.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)
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.