Tag: 反思

无法将XXXXXX类型的对象强制转换为IXXXXX类型(.NET 4.0)

有人可以解释一下我发生了什么事吗? 我有一个测试项目,测试我的服务的虚拟实例。 在测试项目中,我只是引用了dummyService.exe和System.SystemProcess dll。 然而,在我的dummyService项目中,我引用了类库,它本身使用来自其他组件的其他dll以及我的解决方案中的其他项目。 问题是,当我运行我的测试时,会抛出exception(加载并在dummyService中工作的dll的First Chanceexception),此外还有invalidcastexception(下面的错误消息)。 无法将“Export.CaseOutputGenerator”类型的对象强制转换为“Export.ICaseOutputGenerator”。 捕获到System.InvalidCastException Message =无法将类型为“Export.CaseOutputProcess.CustomCaseOutputGenerator”的对象强制转换为类型“Export.CaseOutputProcess.ICaseOutputGenerator”。 Source = Export.CaseOutputProcess StackTrace:位于C:\ Monitor \ Export.CaseOutputProcess \ CaseOutputGeneratoryFactory.cs中的Export.CaseOutputProcess.CaseOutputGeneratoryFactory.GetCaseOutputGeneratorObject(String assemblyName,String className):Monitor.BOMock.GenerateCaseOutput中的第56行(String OutputFolder,String iFile C:\ Monitor \ BOMock \ BOMock.cs中的,Int32 seqNum,DataTable CaseSettings,String SettingFileName):C:\ Monitor \ BOMock \ BOMock.cs中的Monitor.BOMock.Handling()中的第1069行:第492行InnerException: public static ICaseOutputGenerator GetCaseOutputGeneratorObject(string assemblyName, string className) { ICaseOutputGenerator customeOutputGen = null; var obj = GetObject(assemblyName, className); […]

为什么`Assembly`和`Module`没有公开定义的构造函数?

我正在用C#构建一个.NET程序集加载器,用于“实验”/了解有关.NET内部操作的更多信息。 我通过派生类型来实现reflectionAPI: RuntimeType:类型 RuntimeFieldInfo:FieldInfo RuntimeMethodInfo:MethodInfo RuntimeParameterInfo:ParameterInfo RuntimeConstructorInfo:ConstructorInfo RuntimePropertyInfo:PropertyInfo 不幸的是我遇到了麻烦,因为以下没有可公开访问的构造函数,所以我不能从它们派生: assembly(未密封 – AssemblyBuilder内部派生自它) 模块(未密封 – ModuleBuilder内部派生自它) 我需要从RuntimeType.get_Assembly和RuntimeType.get_Module返回一些东西。 建议? 发挥创意 – 我必须这样做。 ;)对于创建RuntimeTypeHandle实例,一些不安全的指针转换可以完成工作,但这并不容易。 暂且不说:现在特别麻烦的是我正在尝试为负载类型打印IL。 对于构造的generics, Type.FullName属性通过AssemblyQualifiedName属性包含generics参数,而AssemblyQualifiedName属性又依赖于Assembly属性。

通过来自相同对象实例(或基础)的reflection调用私有/受保护方法

是否可以通过reflection调用受保护的方法。 我用这个: Me.GetType.InvokeMember(Stages(CurrentStage), Reflection.BindingFlags.InvokeMethod, Nothing, Me, Nothing) 总是调用没有参数或返回的方法。 我的想法是,我的对象的用户(业务逻辑的事务处理)inheritance基类添加一个私有方法来加载。 然后,他们按照他们希望触发的顺序将这些方法名称添加到列表中,上面的代码将负责触发它们。 它适用于公共方法,但不适用于同一类中的私有或受保护方法(受保护,因为我有一些’标准’预构建方法要添加到基类)。 实际上,我可以将这些方法公之于众,但我内心的书呆子不会允许我这样做…… 我假设这是一个安全function。 有没有办法解决这个问题,或者有没有人对如何继续进行任何建议,但保持我美味,美味的能见度调节剂? (注意:ITS在VB.NET中,但如果你觉得这是一个C#答案就好了)。

如何将对象强制转换为在运行时提取的Type

我使用reflection来获取对象的类型,或者对于此问题,在运行时使用具有实例属性类型的对象,然后我需要将现有变量的类型更改为新找到的类型。 这可能吗? 例如,以下代码在以下行中指示的行中不起作用: Public Sub DoSomething(x As T, y As T, exp As String) ‘This is a instance property on the object of a different type ‘ie ‘T.AnotherType’ We need to reflect to find out what type of object ‘AnotherType is and work with it If exp.Split(“.”).Count Then Dim tp As Type = Nothing tp […]

是否可以将属性名称作为字符串传入并为其赋值?

我正在设置一个简单的帮助器类来保存我正在解析的文件中的一些数据。 属性的名称与我期望在文件中找到的值的名称相匹配。 我想在我的类中添加一个名为AddPropertyValue的方法,这样我就可以为属性赋值而无需通过名称显式调用它。 该方法如下所示: //C# public void AddPropertyValue(string propertyName, string propertyValue) { //code to assign the property value based on propertyName } — ‘VB.NET’ Public Sub AddPropertyValue(ByVal propertyName As String, _ ByVal propertyValue As String) ‘code to assign the property value based on propertyName ‘ End Sub 实现可能如下所示: C#/ VB.NET MyHelperClass.AddPropertyValue(“LocationID”,”5″) 这是否可以,而不必针对提供的propertyName测试每个单独的属性名称?

反思真的很慢吗?

这是一种普遍的看法,即反思很慢,并试图尽可能地避免它。 但在目前的情况下,这种信念是否属实? 目前的.net版本有很多变化,比如使用IL Weaving(即IL Emit)等,而不是传统的PropertyInfo和MethodInfo进行reflection的方式。 这是否有任何令人信服的证据,新的反映不再那么慢,而且可以使用。 是否有更好的方法来读取属性数据? 谢谢,巴斯卡尔

.NETreflection创建类属性

我对reflection很新,我想知道,如果可能的话,如何创建类的实例然后向类中添加属性,设置这些属性,然后再读取它们。 我没有任何代码,因为我甚至不知道如何开始这个。 C#或VB很好。 谢谢 编辑:(详细说明) 我的系统有一个动态表单创建者。 我的一位同事要求表格数据可通过网络服务访问。 我的想法是创建一个类(基于动态表单)向类添加属性(基于表单字段)设置这些属性(基于这些字段的输入值)然后返回Web服务中的类。 此外,Web服务将能够在类中设置属性,并最终将这些更改提交到数据库。

有没有办法在运行时构建新类型?

我会问一个可能听起来很奇怪的问题。 有没有办法在运行时构建一个新类? 或者至少,向现有类添加新属性。 我的意思是创建一个不存在的类,而不是现有类的实例。 我以后可以使用reflection来加载和使用这个类。

编译日期和时间

是否有一些聪明的方法来获取dll构建/编译的日期和时间? 在部署应用程序时,我正在使用程序集版本编号和reflection来检索和显示此信息。 但在某些情况下,知道dll实际编译的时间比自动递增版本号更方便。 由于应用程序的部署方式,我认为dll文件本身的修改日期不可靠。 Dim assemblies = AppDomain.CurrentDomain.GetAssemblies Dim assemblyName As String Dim assemblyVersion As String For Each assembly In assemblies assemblyName = assembly.GetName.Name.ToString assemblyVersion = assembly.GetName.Version.ToString ‘ How to get the date/time of the build?? ‘ … Next 有什么建议?

C#如何添加要在运行时执行的代码

我知道这个要求对你们很多人来说似乎很受欢迎,但这是我的项目要求之一。 是否可以在Sp中添加代码并在.Net exe中执行。 就像在按钮上单击我调用一个SP,SP返回几行代码,然后程序执行代码。 有可能,如果是,那么如何? 我正在使用框架1.1