2 chyun2011 chyun2011 于 2016.05.10 09:59 提问

C# 接口 反射 奇怪的问题

1、定义一个接口,用于获取用户的功能点。因为有些项目中甲方有自己的权限平台,所以这里反接口开放出来。
public interface IUserFuns
{
List GetFunCodes(string userID);
}
2。我的系统中也自己做了一套授权功能。实现1中的接口
public List GetFunCodes(string userID)
{
List modules = new List();
modules.Add("0000");
modules.Add("0001");
modules.Add("0002");
modules.Add("0003");
modules.Add("0004");
return modules;
}
} 这只是用来测试的。
3、 接口开放在配置文件里,

<!---->
4、根据配置文件的信息,获取功能点权限
//获取类信息 动态调用
Assembly asb = Assembly.LoadFile(assName);
object obj = asb.CreateInstance(section.TypeName);
if (typeof(IUserFuns).IsInstanceOfType(obj))
{
IUserFuns module = obj as IUserFuns;
listCodes = module.GetFunCodes(userID);
}
assName是实现接口的文件的全路径名称

section.TypeName是实现接口的类的全名称,命名空间命+类名
5、问题:4中的判断,if (typeof(IUserFuns).IsInstanceOfType(obj))
如果obj跟IUserFuns在同一个项目中typeof(IUserFuns).IsInstanceOfType(obj)就是false,如果obj跟IUserFuns不在同一个项目中,typeof(IUserFuns).IsInstanceOfType(obj)就是true,这是为什么?

3个回答

caozhy
caozhy   Ds   Rxr 2016.05.10 10:01
已采纳

本来就是这样,要么放在一个项目中,要么强签名后注册到gac中。

chyun2011
chyun2011   2016.05.10 10:04

但是我在控制台应用程序中这样做是可以的啊?

caozhy
caozhy 不同程序集里定义的同名类型当然被视作独立的类型,这也是出于安全的考虑。
大约 2 年之前 回复
u012758945
u012758945   2016.05.10 12:22

用 if ( obj is IUserFuns ) 试试看。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C#反射解析数据内容,调用方法
主要是分享C#中的一些处理方法: 1.反射获取成员值 2.反射获取未知类型成员内容 3.反射获取成员工具类 这部分主要是为了拿到实例的时候我们可能不清楚实例或成员的类型,但知道起成员的名称或需要拿到其全部成员信息,这个时候就值得用到反射来获取类的详细信息了。 下面显示用反射来获取一个对象某个成员的值。
C#工厂模式(反射,接口,抽象类)
1、反射,接口,具体方法。 流程:UI传递信息到BLL层,BLL首先  IDBHelper dbhelper = ComDBHelper.GetDBHelper();或  private static IMerchantCoupons _accesser =Coupons_Access.CreateMerchantCoupon(); 调用发射机制,加载数据库具体操作类的DLL文件实现接
C#反射方法:程序集反射、类型反射、接口反射、类型成员反射
C#反射方法:程序集反射、类型反射、接口反射、类型成员反射            反射(原创推荐)                 在程序中,当我们需要动态的去加载程序集的时候(将对程序集的引用由编译时推移到运行时),反射是一种很好的选择。反射为.NET类型提供了高度的动态能力,包括:元数据的动态查询、绑定与执行、动态代码生成。常用的反射类型包含在System.Reflection和
C# 反射-通过继承接口实现创建对象并调用方法
初学反射,在个人理解中,他的主要目的是为了让系统实现可扩展 可配置。 反射+配置文件+工厂 为例 先来一个接口类 public interface IShowFun { void Say(); void Do(); } 一个集成该接口的方法 public class ShowGirlFun:IShowFun {
c# 反射调用程序集方法、接口实例
新建类库:Webtest 添加相应类:ReflectTest 接口interface1 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Webtest {     public interface interface1     {
C# 反射实例代码 接口方式动态加载dll方式
C# 反射实例代码 接口方式动态加载dll方式
C#--[反射]如何知道一个类都实现了哪些接口和从那个类继承
可能的情况有:从一个类继承,从一个或多个接口继承,从一个类和一个或多个接口继承。 使用Type类的BaseType属性来取得类从哪个类继承。GetInterfaces方法来取得类都实现了哪些接口。 测试代码如下: 类库代码: using System; namespace GetInterface {    public class Class1 : Class2,Ba
C#利用反射动态加载DLL(C#)并调用其中的接口
看了很多文章都说反射怎么怎么慢啊,明显就是对于反射的理解不够。的确你可以方便的去调用一个DLL的函数(虽然我从来不觉得用函数名作为字符串去调用是方便的),就像C++也可以动态调用DLL里面的函数一样,但是用过C++的人都知道傻逼才自己去声明回调去一个一个调用里面的函数,除非你真的闲的蛋疼。 但是C++有头文件可以include,这样编译器就知道这样行得通,而C#该怎么实现这样的Include?最
C# 反射-不需要接口约束,调用各种方法
反射优缺点 优点:动态 缺点: 1、避开编译器检查,在有错误的情况下,在编译的时候不会报错,只有运行的时候才会报错 2、用起来不只管,不方便 3、性能有损失 调用实例方法 创建一个实例方法 namespace DoSomeThing { public class Funtions { public void ShiLi()
C#委托,事件,接口,反射和关键字
一、sealed关键字        sealed 修饰符可以应用于类、实例方法和属性。用于类时,该类被称为密封类,密封类不能被继承;用于方法时,该方法被称为密封方法,密封方法会重写基类中的方法;sealed修饰符应用于方法或属性时,必须始终与override一起使用;结构是隐式密封的,因此它们不能被继承。