Tag: reflection

在C#4.0中使用动态的RuntimeBinderException

我有一个界面: public abstract class Authorizer where T : RequiresAuthorization { public AuthorizationStatus Authorize(T record) { // Perform authorization specific stuff // and then hand off to an abstract method to handle T-specific stuff // that should happen when authorization is successful } } 然后,我有一堆不同的类,它们都实现了RequiresAuthorization,相应地,每个都有一个Authorizer (我的域中的每个业务对象需要不同的逻辑才能在授权记录后执行)。 我也在使用UnityContainer,我在其中注册了各种Authorizer 。 然后我有一些代码如下,从数据库中找到正确的记录并授权它: void Authorize(RequiresAuthorization item) { var dbItem = […]

为什么我不能使用Type.InvokeMember检索type out或ref参数的值?

一个很长的标题,但我希望它具体。 标题确实是个问题。 尽管InvokeMember调用的方法有一个out参数,并且正在为该参数赋值,但我无法获取该值。 这是我最初使用的代码: string parameter = “”; int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new object[] { parameter })); 我改变了这个,现在它按预期工作但我不知道为什么: object[] args = new object[1]; //necessary to retrieve ref/out parameter int result = Convert.ToInt32(typeof(Ability).InvokeMember(selectedMove, BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, args));

获取所有引用程序集的路径

如何获取当前正在执行的程序集引用的所有程序集的路径? GetReferencedAssmblies()为我提供了AssemblyName[] 。 我如何从那里到达它们的装载位置?

取出特定命名空间的所有类

有没有办法从特定的命名空间中获取对象? 也许使用System.Reflections ? 我想从命名空间ITestType中的Test.TestTypes类型中获取所有对象作为对象,以便我有一个TestType1, TestType2, TestType3等实例列表。 有人能帮我吗? 我不知道在哪里搜索。

如何在C#中使用后期绑定从程序集中获取枚举值

我有一个C#3.0 WinForms应用程序,偶尔需要通过自动化控制Excel。 这与正常的早期绑定很好地工作,但是当人们没有安装Excel但仍想使用我的应用程序时,我遇到了一些问题,除了Excel部分。 后期绑定似乎是解决这个问题的方法。 在C#3中,后期绑定相当繁琐,但我没有做任何特别困难的事情。 我正在关注http://support.microsoft.com/kb/302902作为首发,它运作良好。 我的问题是如何按名称使用枚举? 例如,我如何使用reflection来获取Microsoft.Office.Interop.Excel.XlFileFormat.xlTextWindows的值,以便我可以使用它InvokeMethod调用InvokeMethod ? 我知道最简单的方法可能是使用相同的“魔术”整数值创建我自己的本地枚举,但是能够通过名称访问它会更好。 文档通常不会列出值,所以为了得到它我可能需要一个早期绑定测试应用程序,可以告诉我的价值。 谢谢

如何获取MethodInfo的通用扩展方法?

我有一个IEnumerable ,我想通过reflection调用Enumerable.Contains方法。 我只是在努力使语法正确。 这是我现在拥有的: var containsMethod = typeof(Enumerable).GetMethod(“Contains”, new[] { typeof(IEnumerable), typeof(T) }); 这只是返回null。 获取MethodInfo的正确方法是什么?

获取代理对象的基础类型

我正在使用Castle DynamicProxy,我的ViewModel是一个代理,如下所示: 命名空间MyApplication.ViewModels { 公共类MyViewModel:BaseViewModel,IMyViewModel { } } 我的viewmodel的代理看起来像这样: {Name =“IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98”FullName =“IRootViewModelProxyffecb133f590422098ca7c0ac13b8f98”} 我想获得被代理的实际类型的实际类型或命名空间。 有没有办法做到这一点? 我想要一些返回MyApplication.ViewModels.MyViewModel类型的东西。 如果我使用concreate类作为代理,BaseType将返回正在代理的实际类,但在使用该接口时,BaseType将返回System.Object。

从struct的const属性中获取值的集合

我有一个看起来像这样的结构: public struct MyStruct { public const string Property1 = “blah blah blah”; public const string Property2 = “foo”; public const string Property3 = “bar”; } 我想以编程方式检索MyStruct的const属性值的集合。 到目前为止,我已经尝试过这个并没有成功: var x = from d in typeof(MyStruct).GetProperties() select d.GetConstantValue(); 有人有主意吗? 谢谢。 编辑 :这是最终为我工作的: from d in typeof(MyStruct).GetFields() select d.GetValue(new MyStruct()); 感谢Jonathan Henson和JaredPar的所有帮助!

我可以将Activator.CreateInstance与接口一起使用吗?

我有一个例子: Assembly asm = Assembly.Load(“ClassLibrary1”); Type ob = asm.GetType(“ClassLibrary1.UserControl1”); UserControl uc = (UserControl)Activator.CreateInstance(ob); grd.Children.Add(uc); 我正在创建一个类的实例,但是如何创建实现某个接口的类的实例? 即UserControl1实现ILoad接口。 U:我可以稍后将对象转换为接口,但我不知道程序集中的哪个类型实现了接口。

在递归函数中防止StackOverFlow

我在BaseClass有一个递归函数,它依赖于protected virtual函数来获取它的返回条件。 子类可能会错误地覆盖此函数并导致StackOverFlowexception。 最糟糕的是网络呼叫速度很慢,而且不会很快发生exception(许多资源浪费了很长时间)。 我正在寻找一种方法来在早期阶段以某种方式在基类中检查StackOverFlow (可能使用Reflection和当前的递归级别)。 任何的想法 ?