Tag: reflection

获取对象的实例名称,而不是C#4.0中的对象类型名称

假设这种类型: public class Car { } 我创建了一个实例: Car myCar = new Car(); Target target = new Target(); target.Model = myCar; 这是另一种类型: public class Target { public object Model { get; set; } string GetName(){ //Use Model and return myCar in this Example } } 正如我在代码中展示的那样, GetName方法必须使用对象类型( Model )并在此示例中返回myCar实例的名称? 你有什么办法可以做到这一点? 更新如何: public class Car { public […]

从string创建类实例

我有一个C#方法,它从字符串创建一个类的新实例,但是,在运行代码时出现错误。 obj = (ClassX)Activator.CreateInstance(Type.GetType(“classPrefix_” + className)); ArgumentNullException未处理 值不能为空 参数名称: 类型 任何有关此错误的帮助将不胜感激。

示例:使用.NET / C中的委托加速Reflection API#

正如本文中所提到的 ,我想出了一个使用Delegate加速.NET / C#中的Refection的示例。 但是,运行时出现此错误(编译工作正常)。 可能有什么问题? Unhandled Exception: System.ArgumentException: type is not a subclass of Multicastdelegate at System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, Boolean throwOnBindFailure, Boolean allowClosed) [0x00000] in :0 at System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method, Boolean throwOnBindFailure) [0x00000] in :0 at System.Delegate.CreateDelegate (System.Type type, System.Reflection.MethodInfo method) [0x00000] in :0 at EX.RefTest.DelegateTest () [0x00000] […]

按名称呼叫财产

我有一个包含100多个唯一命名属性的类和20多个子类,有时在列表中。 以下是我的意思的大大简化的说明: public class classA { public String PropertyA1 { get; set; } public int PropertyA2{get;set;} public List myList; public classC myClass { get; set; } public void SetProperty(String PropertyName) { // Match property name to property in this class or child class. } } class classB { public String PropertyB1 { get; set; } […]

reflection – 获取lambda表达式中的方法调用列表

我试图找到一种方法来获取C#3.5中lambda表达式内的方法调用列表。 例如,在下面的代码中,我想方法LookAtThis(Action a)来分析lambda表达式的内容。 换句话说,我希望LookAtThis返回Create的MethodInfo对象。 LookAtThis(() => Create(null, 0)); 可能吗? 谢谢!

派生类中的强制属性声明

我最近阅读了有关属性和reflection的内容,我认为在我的程序中包含元数据是一种很好的方法。 我有这个抽象类,我希望从它inheritance的所有类都向类声明一些属性,因为我希望为我的程序创建自定义组件(那些派生类),并希望在运行时读取这些类的元数据。 但是,派生类都必须显式声明我存储元数据的属性。 那么如何在派生类中强制执行属性声明呢? 谢谢。

IL Emit用于调用委托实例?

基本上,我接受一个事件名称作为字符串,以获取EventInfo 。 然后,我使用reflection发现事件处理程序类型和事件参数类型,创建该类型的新委托( myEventHandler ),并将其与事件挂钩。 当调用myEventHandler ,我需要向下转换并将参数传递给处理程序。 我的代码如下。 当调用’d’时,需要通过myEventHandler调用’handler’。 我需要在那里放一些reflection发射代码??? 有什么想法吗? EventHandler handler = delegate(object sender, EventArgs eventArgs) { //something will happen here }; Type[] typeArgs = { typeof(object), derivedEventArgsType }; DynamicMethod myEventHandler = new DynamicMethod(“”, typeof(void), typeArgs); var ilgen = myEventHandler.GetILGenerator(); //What should be the IL code here to //cast derviedEventArgs to EventArgs and […]

定义每个子类定义一次的静态属性的最佳方法是什么?

我编写了以下控制台应用程序来测试静态属性: using System; namespace StaticPropertyTest { public abstract class BaseClass { public static int MyProperty { get; set; } } public class DerivedAlpha : BaseClass { } public class DerivedBeta : BaseClass { } class Program { static void Main(string[] args) { DerivedBeta.MyProperty = 7; Console.WriteLine(DerivedAlpha.MyProperty); // outputs 7 } } } 正如此控制台应用程序演示的那样, MyProperty属性对于所有BaseClass实例都存在一次。 是否有使用的模式允许我定义一个静态属性,该属性将为每个子类类型分配存储? […]

C#:在单独的Thread中调用 .InvokeMember()方法

我正在使用此代码,我在调用从dll动态加载的类的List的run方法: for (int i = 0; i < robotList.Count; i++) { Type t = robotList[i]; //robotList is a List object o = Activator.CreateInstance(t); t.InvokeMember(“run”, BindingFlags.Default | BindingFlags.InvokeMethod, null, o, null); } invokeMember正在调用列表中每个类的run方法。 现在我如何在一个单独的线程中从invokeMember调用这个run方法 ? 这样我就可以为每个被调用的方法运行单独的线程。

如何使用类型名称作为字符串转换为类型?

好吧,我现在整天都在喋喋不休地谈论这个想法,而且我已经达到了我承认我只是不知道的部分。 我正在做的事情可能只是愚蠢而且有更好的方法,但这是我思考带给我的地方。 我试图使用通用方法在WinForms中加载表单: protected void LoadForm(ref T formToShow, bool autoLoaded) where T : FormWithWorker, new() { // Do some stuff } 表单由ToolStripMenuItem加载(通过选择项目或使用“打开Windows”菜单项)。 它们是延迟加载的,因此MDI父级中的表单有字段,但在需要它们之前它们为空。 我有一个用于处理所有菜单项单击的ToolStripMenuItem_Click的常用方法。 除了ToolStripMenuItem的名称与为其对应的表单类名称选择的模式匹配之外,该方法没有真正的方法来知道调用哪个表单。 因此,使用ToolStripMenuItem的名称,我可以为所请求的表单类型的名称和分配用于存储该表单的引用的私有字段的名称。 使用它,我可以使用具有硬编码类型的增长/收缩switch语句和字符串匹配来调用具有特定类型集(不需要的)的方法,或者我可以使用Reflection来获取字段并创建该类型的实例。 我遇到的问题是, System.Activator.CreateInstance提供了一个无法转换为我需要的类型的ObjectHandler。 这是我到目前为止的一小部分: string formName = “_form” + ((ToolStripMenuItem)sender).Name.Replace(“ToolStripMenuItem”, “”); string formType = formName.Substring(1); FieldInfo fi = this.GetType().GetField(formName, BindingFlags.NonPublic | BindingFlags.Instance); FormWithWorker formToLoad = (FormWithWorker)fi.GetValue(this); if (formToLoad == […]