Tag: reflection

Assembly.GetType()和typeof()返回不同的类型?

假设您获得了一个由以下简单代码编译的Class.dll程序集: namespace ClassLibrary { public class Class { } } 并考虑使用上述Class.dll作为项目引用的不同项目,并使用以下代码: Assembly assembly = Assembly.LoadFrom(@”Class.dll”); Type reflectedType = assembly.GetType(“ClassLibrary.Class”); Type knownType = typeof(ClassLibrary.Class); Debug.Assert(reflectedType == knownType); 断言失败了,我不明白为什么。 如果我将ClassLibrary.Class替换为System.Text.RegularExpressions.Regex类和带有System.dll的Class.dll,断言会成功,所以我猜它与项目属性有关吗? 一些编译开关或许? 提前致谢

C#非常动态的调用

我想用C#写这个: SomeUnknownType x; SuperDuperInvoke(x, “MethodName”, param1, param2, param3); SuperDuperInvoke2(x, “MethodName”, “param1String”, “param2String”, “param3String”); 获取我一无所知的对象,方法名称和参数列表,然后调用该方法。 SuperDuperInvoke2假设参数可以从字符串转换。 我假设使用动态框架这样的事情是可能的…我只是找不到如何…… 我知道我可以用reflection做到这一点,但它很丑陋而烦人…… 我会解释一下自己。 我想用它来进行某些业务服务器的集成测试。 服务器有许多可以处理请求的不同组件,所有组件都加载到IoC容器中。 我需要暴露一些组件,主要用于测试,所以我想只接收组件的名称,我应该用什么参数调用什么方法,然后调用它。

有没有办法在C#中简化这个reflection代理代码?

在这个响应中,我提出了以下帮助方法,可以由不同的Task创建者重用,以将事件转换为任务完成源。 // Helper method static Task TaskFromEventHelper(object target, string eventName, Func<TaskCompletionSource, object> resultSetterFactory) { var tcs = new TaskCompletionSource(); var addMethod = target.GetType().GetEvent(eventName).GetAddMethod(); var delegateType = addMethod.GetParameters()[0].ParameterType; var d = Delegate.CreateDelegate(delegateType, resultSetterFactory(tcs), “Invoke”); addMethod.Invoke(target, new object[] {d}); return tcs.Task; } // Empty events (Action style) static Task TaskFromEvent(object target, string eventName) { return TaskFromEventHelper(target, eventName, […]

Assembly.LoadFrom是否保持打开文件句柄?

我正在使用加载另一个程序集 Assembly.LoadFrom(“path.exe”); 之后我似乎无法从文件系统中删除该exe。 所以我想知道这条路径是否保持打开文件句柄以及如何关闭它?

静态成员和接口

我刚刚对这个主题进行了一些SO问题,发现这是(目前?)不可能在接口中定义静态成员或者使静态方法成为虚拟。 我现在正在努力应对这种情况。 让我试着用一个简单的例子来描述它: 我有一个名为say IAnimal的接口,其定义如下: interface IAnimal { … int Chromosomes {get; } //should ideally be static, but that’s not allowed! … } 然后我有一个实现IAnimal的基类Animal,并提供所有动物共有的一些方法的实现: abstract class Animal : IAnimal { … public abstract int Chromosomes {get; } //necessary becuz of IAnimal … } 在这之下,我有从Doginheritance的Dog , Cat和Zebra类,并为它们的物种提供这个属性的具体实现。 现在问题是:这些类是在运行时发现的(通过Pluggable-modules的Assembly.LoadFile() becuz)。 发现的类保存在List ,我们稍后用它来创建具体的狗和猫。 用于创建动物的输入参数是染色体编号,因此例如他们会问: 创建具有72条染色体的类型的动物。 所以我需要以某种方式获取List中每个Type的Chromosome属性值并返回第一个匹配的Type 。 由于Chromosomes不是静态的(如果是,我可以很容易地运行给定类型的静态成员 […]

确定是否可以将reflection类型强制转换为另一种reflection类型

在.net(C#)中,如果通过reflection发现了两种类型,是否可以确定是否可以将其转换为另一种? (隐式和/或显式)。 我要做的是创建一个库,允许用户指定一种类型的属性映射到另一种类型的属性。 如果两个属性具有匹配类型,一切都很好,但我希望能够允许它们映射隐式/显式转换可用的属性。 所以,如果他们有 class from { public int IntProp{get;set;} } class to { public long LongProp{get;set;} public DateTime DateTimeProp{get;set;} } 他们可以说from.IntProp将被分配到.LongProp(作为一个隐形演员存在)。 但如果他们说它映射到DateTimeProp我就能确定没有可用的强制转换并抛出exception。

当属性类型未知时,通过reflection创建属性访问者的委托

在.NET 2.0(使用C#3.0)中,当我在编译时不知道它的类型时,如何为通过reflection获得的属性访问器创建委托? 例如,如果我有int类型的属性,我可以这样做: Func getter = (Func)Delegate.CreateDelegate( typeof(Func), this, property.GetGetMethod(true)); Action setter = (Action)Delegate.CreateDelegate( typeof(Action), this, property.GetSetMethod(true)); 但如果我不知道该属性在编译时是什么类型,我不知道该怎么做。

存储一个EventHandler列表以取消订阅

我有一个带有方法的类, Register使用标准的aClass.SomeEvent += the_handler来订阅它包含的类上的许多事件。 此类还有一个Unregister方法,使用-=取消订阅这些事件。 这很好但我们发现如果我们添加一个新事件来订阅它,很容易忘记在取消Unregister包含取消订阅。 这种维护事件订阅的手动方法被certificate是脆弱的。 有没有办法维护一个可以迭代和动态取消订阅的订阅列表? (并且在Unregister Register后调用Register时可能会迭代并重新订阅)。 一些细节:该类引用了其他3个类(当前,但不限于3),这些类上的各种事件都是EventHandler或EventHandler 。

c#递归reflection和通用列表设置默认属性

我试图使用reflection来实现以下目的: 我需要一个方法,我传入一个对象,这个方法将递归实例化具有子对象的对象,并使用默认值设置属性。 我需要实例化整个对象,根据需要进行多个级别。 此方法需要能够处理具有多个属性的对象,这些属性将是其他对象的通用列表。 这是我的示例代码(当我得到一个包含List的对象时,我得到一个参数计数不匹配exception: private void SetPropertyValues(object obj) { PropertyInfo[] properties = obj.GetType().GetProperties(); foreach (PropertyInfo property in properties) { if (property.PropertyType.IsClass && property.PropertyType != typeof(string) && property.PropertyType.FullName.Contains(“BusinessObjects”)) { Type propType = property.PropertyType; var subObject = Activator.CreateInstance(propType); SetPropertyValues(subObject); property.SetValue(obj, subObject, null); } else if (property.PropertyType == typeof(string)) { property.SetValue(obj, property.Name, null); } else if (property.PropertyType […]

在c#中查找已编译类的源文件

我希望在一组编译的.net程序集中找到特定类的相关源文件。 例如 MyAsm.Namespace.Foo -> C:\Source\foo.cs MyAsm.Namespace.Bar -> C:\Source\Code\MoreCode\Common.cs MyAsm.Namespace2.Bar -> C:\Source\Code\MoreCode\Common.cs … 我有使用标准System.Reflectionfunction的程序集reflection/提取我感兴趣的类型信息。 我现在需要找到该类的原始.cs源文件。 虽然我有一个powershell解决方案作为一种解决方法,但它的速度令人无法接受。 我希望在5秒内完成整个过程。 目前,reflection提取部分花费不到1秒,“文件关联”需要几分钟。 我不认为在4秒内扫描几个MB是不合理的。 不幸的是,有一些警告,可以防止捷径。 我不知道文件的名称,所以每次运行我都需要做一个dir / s *.cs来枚举所有潜在的源文件。 类名称并不总是与源文件匹配,它可以提示可能的位置,但不能保证其工作。 在某些情况下,在同一文件中定义了多个类。 有~20k .cs文件/ 63MB源。 我需要~10k类/他们的文件之间的关联。 我不想逐步构建一个带有文件名/类的DB,因为文件内容会发生变化,我将无法维护这个DB等(尽管我可能不得不沿着这条路走下去)否则失败)。 操作系统将运行,不会启用Windows搜索/索引,所以也没有喜悦。 我尝试过的: 使用findstr.exe – 太慢了 创建.net应用程序,将所有文件加载到内存中。 – 找到* .cs /加载所有文件的速度太慢,一旦文件在内存中就会快速扫描。 从所有较小的文件创建一个大型源文件,加载它,扫描等 – 再次,太慢了。 一旦加载,需要几分钟来构建文件。 阅读PDB文件 – 我正在调查PDB2XML.exe,虽然它确实输出文件名,并且运行速度很快,但我无法看到如何将类与文件名相关联。 那么,有没有人有PDB2XML的替代建议,魔术或一些经验?