一个同时继承abstract和interface的类,如何通过反射创建对象??

liuzuofei 2007-12-03 09:18:11
一般如果一个
classA :InterfaceB
那么通过下面的方式:
Type _Asstype = ass.GetType(_classA);
InterfaceB pi = Activator.CreateInstance(_Asstype) as InterfaceB;
这个创建这个类对象。

可是如果:
classA :abstractC, InterfaceB
那么如何类似上面创建对象?
...全文
251 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuzuofei 2007-12-04
  • 打赏
  • 举报
回复
建议该帖置顶!
liuzuofei 2007-12-04
  • 打赏
  • 举报
回复
Q282898034:
谢谢你的code,你的做法 不是很适合我的系统(这种方式会造成interface的不稳定)
我的做法和panjf的不谋而合:
Object pi =Activator.CreateInstance(_Asstype)as InterfaceB;
调用时用(InterfaceB)pi和(abstractC)pi。

谢谢各位,结贴!!
liuzuofei 2007-12-04
  • 打赏
  • 举报
回复
panjf:
谢谢,我正是这样做的,
(今天没有空上来,现在一看,这么多热心的同志帮顶,谢谢!)
liuzuofei 2007-12-03
  • 打赏
  • 举报
回复
自己顶起来!
liuzuofei 2007-12-03
  • 打赏
  • 举报
回复
可是这样做的话,C里的东西就没有办法使用了,这不是我想要的,
panjf 2007-12-03
  • 打赏
  • 举报
回复
如果你只用到接口部分的属性和方法,你那样写就没问题,如果还要用到C里的东东就没办法用接口来实现,因为你这个类是个多继承啊。
liuzuofei 2007-12-03
  • 打赏
  • 举报
回复
因为我想暴露出去的是接口而不是类的细节,如何做啊?
liuzuofei 2007-12-03
  • 打赏
  • 举报
回复
如果想基于接口来实现,怎么做??
panjf 2007-12-03
  • 打赏
  • 举报
回复

Type _Asstype = ass.GetType(_classA);
classA pi = Activator.CreateInstance(_Asstype) as classA;
Q282898034 2007-12-03
  • 打赏
  • 举报
回复
刚才调试了一下,修改没有任何作用,vs2005里编译时 class A : InterfaceB 通不过,看来只好手动填写让它return this 还是 return null 了。
liuzuofei 2007-12-03
  • 打赏
  • 举报
回复
有谁帮帮忙!!
Q282898034 2007-12-03
  • 打赏
  • 举报
回复
代码写的不强壮,修改一下
        abstractC InterfaceB.ToAbstractC
{
get { return this as abstractC; }
}
Q282898034 2007-12-03
  • 打赏
  • 举报
回复
20分有点少,要求加分

在接口里加上一个属性,通过该属性来访问abstractC:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace ConsoleApplication45
{
public abstract class abstractC
{
public string ClassName = "abstractC";
public abstract char Method_C();
}
public interface InterfaceB
{
abstractC ToAbstractC { get;}
char Method_B();
}
class A : abstractC, InterfaceB
{
private char a='A', b='B', c='C';
public int Method_A()
{
return a;
}
public override char Method_C()
{
return c;
}
char InterfaceB.Method_B()
{
return b;
}
abstractC InterfaceB.ToAbstractC
{
get { return this; }
}
}
class Program
{
static void Main(string[] args)
{
Assembly ass = Assembly.GetExecutingAssembly();
Type _Asstype = ass.GetType(new A().ToString(),true);
InterfaceB pi = Activator.CreateInstance(_Asstype) as InterfaceB;
// InterfaceB
Console.WriteLine(pi.Method_B());
// abstractC
Console.WriteLine(pi.ToAbstractC.ClassName);
Console.WriteLine(pi.ToAbstractC.Method_C());
// class A 的内容不可见
// Console.WriteLine(pi.Method_A());
Console.Read();
}
}
}
panjf 2007-12-03
  • 打赏
  • 举报
回复
为什么不试着把C和B合起来定义呢?
或者:
Object pi = Activator.CreateInstance(_Asstype) as InterfaceB;

调用时用(InterfaceB)pi和(abstractC)pi。

111,097

社区成员

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

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

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