Tag: reflection

基类可以确定派生类是否覆盖了虚拟成员吗?

这是我class级的简化版本: public abstract class Task { private static object LockObject = new object(); protected virtual void UpdateSharedData() { } protected virtual void UpdateNonSharedData() { } public void Method() { lock(LockObject) { UpdateSharedData(); } UpdateNonSharedData(); } } 我试图隐藏派生类的锁定代码。 但是,如果派生类重写UpdateSharedData,我只想获取锁; 如果没有,我不希望该方法在更新非共享数据之前阻止并等待所有其他正在更新共享数据的正在运行的实例。 所以对于Method来说(看似)显而易见的事情是检查并查看当前实例的UpdateSharedData实现是否覆盖了基类的实现。 我很确定如果不使用reflection这是不可能的,并且可能不希望这样做。 我已经想到了一些解决方法,但它们都很尴尬: 添加派生类的构造函数设置的受保护bool属性,并检查该属性以查看是否需要锁定。 这在隐藏派生类中的锁定代码方面做得非常糟糕。 使UpdateSharedData方法成为委托属性,让任何派生类在其构造函数中将属性设置为私有方法,并且只有在委托不为空时才获取锁。 那更好,但它仍然很糟糕。

使用带reflection的XPath样式查询

我有一个类树,它包含层次结构中的多个对象。 所以我可能有一个Container对象,它承载3个SubContainer对象,这些对象又承载任意数量的Item对象。 有没有什么办法可以在这个对象树上使用XPath样式的表达式,这意味着reflection,这样我就可以使用XPath样式的表达式查询类的属性,这样代码看起来像: object o = Container.Query(“/Container/SubContainer[1]/Item[1]/@ItemProperty”); 显然这完全弥补了,并且可能不是有效的XPath语法,但它只是为了让您了解我正在寻找什么。 编辑 – >我想以这种方式查询的原因是因为对象的路径不是固定的,因此需要由应用程序用户配置。 谢谢。

计算IOrderedEnumerable而不使用它

我想做什么,短版: var source = new[]{2,4,6,1,9}.OrderBy(x=>x); int count = source.Count; // <– get the number of elements without performing the sort 长版: 要确定IEnumerable中元素的数量,必须迭代所有元素。 这可能是一项非常昂贵的操作。 如果可以将IEnumerable转换为ICollection ,则可以快速确定计数而无需迭代。 LINQ Count()方法自动执行此操作。 函数myEnumerable.OrderBy()返回一个IOrderedEnumerable 。 IOrderedEnumerable显然不能转换为ICollection ,因此调用Count()将消耗整个事物。 但排序不会改变元素的数量,并且IOrderedEnumerable必须保持对其源的引用。 因此,如果该源是ICollection ,则应该可以从IOrderedEnumerable中确定计数而不消耗它。 我的目标是有一个库方法,它接受带有n个元素的IEnumerable ,然后例如检索位置为n / 2的元素; 我想避免迭代IEnumerable两次只是为了得到它的计数,但我也想避免创建一个不必要的副本,如果可能的话。 这是我想要创建的函数的框架 public void DoSomething(IEnumerable source) { int count; // What we do with the source depends […]

Reflection Emit:如何将Attribute实例转换为CustomAttributeBuilder或CustomAttributeData

我创建了一个生成器类,它基于实现接口的接口构建代理类。 请参阅我在基于接口构建代理类的post而不实现它 。 我熟悉CustomAttributeData.GetCustomAttributes(MemberInfo target) ,当我读取Interface的成员并成功将它们导入代理时,我使用它。 我想在运行时向生成的类注入其他属性。 我要求将属性实例注入代理中。 例如: 开发人员可以将其作为值传递: new ObsoleteAttribute(“Demo”, true) ,(它有一个空构造函数,但属性是只读的),我想将其转换为: return new CustomAttributeBuilder( attribute.GetType().GetConstructor(Type[] {typeof (string), typeof (bool)}), new object[] {“Demo”, true}, new FieldInfo[0], new object[0]); 记住,我不知道给出了什么。

中等信任的匿名类型,与reflection而不是表达式一起使用

我在Medium Trust中对Linq查询进行自定义投影,我得到一个MethodAccessException或TypeAccessException抱怨reflection和安全权限。 我已将代码简化为以下内容: var anon1 = new { Name = “Bill Gates” }; var ctor = anon1.GetType().GetConstructors().First(); // With native Reflection it works var anon2 = ctor.Invoke(new object[] { “Steve Ballmer” }); var expr = Expression.New(ctor, Expression.Constant(“Scott Guthrie”)); var lamb = Expression.Lambda(expr); // This throws in Medium Trust var anon3 = lamb.Compile().DynamicInvoke(); anon1.ToString(); // –> […]

为什么Type.GetElementType返回null?

我有一个方法,将IEnumerable类型的对象作为输入参数。 我想枚举枚举,并为每个项目使用reflection来获取每个属性的值。 我有以下代码: protected void WriteData(IEnumerable data) { var enumerationTypeInfo = data.GetType(); var itemTypeInfo = enumerationTypeInfo.GetElementType(); … } 问题是enumerationTypeInfo.GetElementType()始终返回null 。 特别是,我将List传递给WriteData ,其中Entry是我创建的类。 当我使用调试器并设置断点时,我可以看到enumerationTypeInfo正确显示它是类型为Entry的List,但为什么GetElementType返回null ? 谢谢

如何在不加载.dll的情况下读取程序集清单

基本上需要以编程方式读取依赖项而不加载程序集本身,因为您无法卸载它们

如何动态引用查找另一个程序集的程序集?

为这个狡猾的问题道歉 – 如果有人有更好的建议,我很乐意改写。 我正在尝试通过动态调用属于另一个应用程序的程序集来创建一个对象。 以下PowerShell代码对我很有用: [Reflection.Assembly]::LoadFrom(“C:\Program Files\Vendor\Product\ProductAPI.dll”) $bobject = new-object ProductAPI.BasicObject $bobject.AddName(“Some Name”) 我在C#中努力做同样的事情。 根据StackOverflow上的其他post,我目前有这个: System.Reflection.Assembly myDllAssembly = System.Reflection.Assembly.LoadFile(“C:\\Program Files\\Vendor\\Product\\ProductAPI.dll”); System.Type BasicObjectType = myDllAssembly.GetType(“ProductAPI.BasicObject”); var basicObjectInstance = Activator.CreateInstance(BasicObjectType); 最后一行导致TargetInvocationException。 {“无法加载文件或程序集’AnotherObject,Version = 1.2.345.0,Culture = neutral,PublicKeyToken = null’或其依赖项之一。系统找不到指定的文件。” 看起来BasicObject构造函数试图调用AnotherObject(来自同一文件夹中的AnotherObject.dll)但找不到它。 关于如何解决这个问题的任何提示?

循环遍历一个对象并找到not null属性

我有2个相同对象的实例,o1和o2。 如果我正在做的事情 if (o1.property1 != null) o1.property1 = o2.property1 对于对象中的所有属性。 循环遍历Object中所有属性的最有效方法是什么? 我看到人们使用PropertyInfo检查nulll属性,但似乎他们只能通过PropertyInfo集合但不链接属性的操作。 谢谢。

我如何知道何时在忽略inheritance的接口的类型中直接实现接口?

出现的问题是当我有一个实现接口的类,并扩展实现接口的类时: class Some : SomeBase, ISome {} class SomeBase : ISomeBase {} interface ISome{} interface ISomeBase{} 由于typeof(Some).GetInterfaces()返回带有ISome和ISomeBase的数组,我无法区分ISome是实现还是inheritance(如ISomeBase)。 作为MSDN我不能假设数组中接口的顺序,因此我迷路了。 方法typeof(Some).GetInterfaceMap()也不区分它们。