兄弟们给看看,奇怪的问题。阿非哥孟子哥求出现

铜臂阿铁木 2011-12-07 09:03:11
比如我有两个逻辑接口
interface RootInterface<Entity>{}
interface MiddleInterface:RootInterface<Entity>{}
一个数据接口
interface Entity{}
一个类去实现MiddleInterface,命名空间是Implement.Impl
class Impl : MiddleInterface{}




这时候我用反射 object obj = Assembly.Load("我的dll").CreateInstance("Implement.Impl");
然后下边出问题了 RootInterface<Entity> root = obj as RootInterface<Entity>;得到的root是null
但是 MiddleInterface middle = obj as MiddleInterface;却能够转换成功。

非常不解。希望能有答案啊。
...全文
239 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
铜臂阿铁木 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 sunzongbao2007 的回复:]

interface RootInterface<T> where T:Entity{}
[/Quote]

我多此一举了,这里根本用不到泛型。我用了还给自己和别人找麻烦了。有数据接口了,直接在定义逻辑接口的时候返回数据接口就好了………………设计过度了。
铜臂阿铁木 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 sandy945 的回复:]

明天去比对下 那里有偏差
[/Quote]

我找到原因了…………我设计的时候彻彻底底的SB了一回。帖子描述也没描述清楚。

主要可以这样描述:

interface Entity{}
class AEntity:Entity{}
interface RootInterface<T> where T:Entity{}
class Impl:RootInterface<AEntity>{}

其实这么简单的写,我们都知道 Impl impl = new Impl();之后,impl is RootInterface<Entity>是false的。
必然不能转啊。
但是我写的架子太大了,自己给自己绕进去了。

哈哈 谢谢阿非哥了,这低级问题打搅你到现在。
阿非 2011-12-07
  • 打赏
  • 举报
回复
明天去比对下 那里有偏差
铜臂阿铁木 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 sandy945 的回复:]

C# code

namespace ClassLibrary
{
public interface Entity { }

public interface RootInterface<T> where T : Entity { }

public interface MiddleInterface : RootInterface<Entity> { }

……
[/Quote]

好奇怪,我在家就好用了,在公司怎么就通不过呢
铜臂阿铁木 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 sandy945 的回复:]

class Impl : MiddleInterface, RootInterface<Entity>

这个是从设计角度 来说的, 接口重新映射

但是 不是你问题的原因
[/Quote]

嗯 是的,这只是设计问题。原因依然在找。
阿非 2011-12-07
  • 打赏
  • 举报
回复

namespace ClassLibrary
{
public interface Entity { }

public interface RootInterface<T> where T : Entity { }

public interface MiddleInterface : RootInterface<Entity> { }

public class Impl : MiddleInterface { }
}




namespace InterfaceCase
{
static void Main(string[] args)
{
object obj = Assembly.LoadFrom("ClassLibrary.dll").CreateInstance("ClassLibrary.Impl");
RootInterface<Entity> root = obj as RootInterface<Entity>;
Console.WriteLine(root == null);

MiddleInterface middle = obj as MiddleInterface;
Console.WriteLine(middle == null);

Console.ReadLine();
}
}
gqqnb 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 sunzongbao2007 的回复:]

我不能使用Assembly.GetExecutingAssembly(),因为设计之初的本意就是可以加载外部dll。
[/Quote]
晕,所以难道是GetExecutingAssembly没问题,Load就有问题?
阿非 2011-12-07
  • 打赏
  • 举报
回复
class Impl : MiddleInterface, RootInterface<Entity>

这个是从设计角度 来说的, 接口重新映射

但是 不是你问题的原因
铜臂阿铁木 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 sandy945 的回复:]

和你引用的程序集有关

Assembly.Load("我的dll")

MiddleInterface RootInterface都在里面么?
[/Quote]

都在里面,我感觉sp1234说的在理。我设计程序的时候,有点想当然了。
看11楼跟19楼。
[Quote=引用 11 楼 gqqnb 的回复:]
用以上代码,两次输出都是false。。。
[/Quote]
我不能使用Assembly.GetExecutingAssembly(),因为设计之初的本意就是可以加载外部dll。
阿非 2011-12-07
  • 打赏
  • 举报
回复
如果都在你引用的程序集理的话

class Impl : MiddleInterface { }

也可以 反射转换成 RootInterface 的
铜臂阿铁木 2011-12-07
  • 打赏
  • 举报
回复
“接口”是一种引用类型,有点像仅包含抽象成员的抽象基类。 类在从接口实现时必须为该接口的所有成员提供实现。 类虽然只能从一个直接基类派生,但可以实现多个接口。

接口用于为不一定具有“是”关系的类定义特定功能。 例如,System.IEquatable(Of T) 接口可由任何类或构造实现,这些类或构造必须启用代码来确定该类型的两个对象是否等效(但是该类型定义等效性)。 IEquatable(Of T) 不表示基类和派生类之间存在的同一种“是”关系(例如 Mammal 是 Animal)。 有关更多信息,请参见 接口(C# 编程指南)。

摘自MSDN: http://msdn.microsoft.com/zh-cn/library/ms173149.aspx

=================================================================================================
提醒自己看过的东西已经要记住……
感谢sp1234,同时也感谢阿非、gqqnb。
阿非 2011-12-07
  • 打赏
  • 举报
回复
和你引用的程序集有关

Assembly.Load("我的dll")

MiddleInterface RootInterface都在里面么?
zhou9870123 2011-12-07
  • 打赏
  • 举报
回复
一天三次么,学习了!
铜臂阿铁木 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sp1234 的回复:]

不管什么强转不强转地,就算转换也不代表着它是继承的。如果是继承的,编译器就支持C# code
接口 x=子类对象实例;
这种代码,根本用不着还纠结什么“强转?”。
[/Quote]

CreateInstance拿回来的是object,只能强转啊。
铜臂阿铁木 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sp1234 的回复:]

引用楼主 sunzongbao2007 的回复:
▪ 企业如何避免实施云计算中的十...▪ 什么是VMware vCloud计划?▪ 云存储目前所面临的问题有?▪ 为什么要选光纤通道用于虚拟化...▪ 物联网与云计算是什么关系?
比如我有两个逻辑接口
interface RootInterface<Entity>{}
interface MiddleInterface:RootInter……
[/Quote]

大神,膜拜你了!!你说的一点都对啊一针见血啊!!!我怎么把这个给忘了……
  • 打赏
  • 举报
回复
不管什么强转不强转地,就算转换也不代表着它是继承的。如果是继承的,编译器就支持
接口 x=子类对象实例;
这种代码,根本用不着还纠结什么“强转?”。
铜臂阿铁木 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sandy945 的回复:]

你需要调用 Type.GetInterface
[/Quote]

我根据Dll的位置,用Assembly.Load方法去做反射,难道编译器认为外部的Dll跟我的Runtime程序集不符?
gqqnb 2011-12-07
  • 打赏
  • 举报
回复
namespace Implement
{
class Program
{
static void Main(string[] args)
{
object obj = Assembly.GetExecutingAssembly().CreateInstance("Implement.Impl");
RootInterface<Entity> root = obj as RootInterface<Entity>;
Console.WriteLine(root == null);

MiddleInterface middle = obj as MiddleInterface;
Console.WriteLine(middle == null);

Console.ReadKey();
}
}

interface RootInterface<T> where T : Entity
{ }

interface MiddleInterface : RootInterface<Entity> { }

interface Entity { }

class Impl : MiddleInterface { }
}


用以上代码,两次输出都是false。。。
  • 打赏
  • 举报
回复
[Quote=引用楼主 sunzongbao2007 的回复:]
▪ 企业如何避免实施云计算中的十...▪ 什么是VMware vCloud计划?▪ 云存储目前所面临的问题有?▪ 为什么要选光纤通道用于虚拟化...▪ 物联网与云计算是什么关系?
比如我有两个逻辑接口
interface RootInterface<Entity>{}
interface MiddleInterface:RootInterface<Entity>{}
一个数据接口
int……
[/Quote]

interface是不支持继承的。只有class才支持继承。

你必须写
class Impl : MiddleInterface, RootInterface<Entity>
之类的代码,既你必须再次指定class也实现之前的接口,否则这个class根本不继承之前的接口。
铜臂阿铁木 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 sandy945 的回复:]

你需要调用 Type.GetInterface
[/Quote]

得到Interface的Type之后呢?
我想得到实现类的实例……不知道怎么办了。
GetInterfaces()也能获得全部两个接口信息,不知道怎么回事,就是强转不回来啊。
加载更多回复(9)

110,536

社区成员

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

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

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