Tag: reflection

使用Reflections设置嵌套属性值

我一直在搜索,但找不到我的问题的确切答案。 以下面的代码为例: public class Company { private string m_strName; private Customer m_objCustomer; public Company() { m_strName = “”; m_objCustomer = new Customer(); } public string Name { get { return m_strName; } set { m_strName = value; } } public Customer CustomerInformaion { get { return m_objCustomer; } set { m_objCustomer = value; } } […]

用lambda表达式参数调用generics方法的reflection

我正在寻找一种方法来调用带有lambda表达式的generics方法,该表达式在一个项目数组中调用Contains。 在这种情况下,我正在使用Entity Framework Where方法,但该方案可以应用于其他IEnumerables。 我需要通过Reflection调用上面代码的最后一行,所以我可以使用任何类型和任何属性传递给Contains方法。 var context = new TestEntities(); var items = new[] {100, 200, 400, 777}; //IN list (will be tested through Contains) var type = typeof(MyType); context.Set(type).Where(e => items.Contains(e.Id)); //**What is equivalent to this line using Reflection?** 在研究中,我注意到我应该使用GetMethod,MakeGenericType和Expression来实现这一点,但我无法弄清楚如何去做。 有这个样本非常有帮助,所以我可以理解Reflection如何与Lambda和Generic概念一起工作。 基本上,目标是编写一个正确版本的函数,如下所示: //Return all items from a IEnumerable(target) that has at least one matching […]

使用数据中的参数调用C#方法

说,我有一个像这样的XML字符串, foo abc def … ghi jkl 我有一个方法 void foo(String param1, String param2, …, String param99, String param100) { … } 有没有简单的方法让我将这个字符串映射到一个真正的方法调用,其中params匹配C#中方法的param名称?

有没有简单的方法来创建方法并在C#中动态设置它的主体?

我在字符串中持有方法体。 我想动态创建方法。 但我不知道,如何设置它的身体。 我看到使用CodeDom非常乏味。 我看到使用Emit和OpCodes。 有没有办法从字符串变量中使用现成的代码? string method_body = “return \”Hello, world!\”;”; //there is method body DynamicMethod dm = new System.Reflection.Emit.DynamicMethod(“My_method”, typeof(string), new Type[] { }); //any way to create method dynamically //any way to set body string result = (string)dm.Invoke(…); //I need write result in variable

创建DirectoryEntry实例以用于测试

我正在尝试创建DirectoryEntry的实例,以便我可以使用它来测试将传递DirectoryEntry的一些代码。 然而,尽管有很多尝试,我找不到实例化DE的方法并初始化它的PropertyCollection。 我有以下代码,这些代码是从SO上的另一个答案中获取和修改的,它正在执行相同的过程但是对于SearchResult对象。 似乎Add方法已被完全禁用,我无法找到一种方法来调用PropertyCollection上的构造函数来传递一些属性。 using System.Collections; using System.DirectoryServices; using System.Globalization; using System.Reflection; using System.Runtime.Serialization; public static class DirectoryEntryFactory { const BindingFlags nonPublicInstance = BindingFlags.NonPublic | BindingFlags.Instance; const BindingFlags publicInstance = BindingFlags.Public | BindingFlags.Instance; public static DirectoryEntry Construct(T anonInstance) { var e = GetUninitializedObject(); SetPropertiesField(e); var dictionary = (IDictionary)e.Properties; var type = typeof(T); var propertyInfos = […]

如何使用reflection调用IDBSet .FirstOrDefault(谓词)?

给定一个IDbSet,其中Person包含“Id”属性,如何执行以下命令: var p = PersonDbSet.FirstOrDefault(i=>i.Id = 3); 我可以构建谓词,并获得对FirstOrDefault扩展方法的引用,但我似乎无法将它们放在一起: 首先是谓词 ParameterExpression parameter = Expression.Parameter(entityType, “Id”); MemberExpression property = Expression.Property(parameter, 3); ConstantExpression rightSide = Expression.Constant(refId); BinaryExpression operation = Expression.Equal(property, rightSide); Type delegateType = typeof (Func).MakeGenericType(entityType, typeof (bool)); LambdaExpression predicate = Expression.Lambda(delegateType, operation, parameter); 现在引用扩展方法: var method = typeof (System.Linq.Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public) .FirstOrDefault(m => m.Name == “FirstOrDefault” && […]

如何在C#中迭代对象的所有属性?

我是C#的新手,我想编写一个函数来迭代一个对象的属性并将所有空字符串设置为“”。 我听说有可能使用一种叫做“reflection”的东西,但我不知道怎么做。 谢谢

使用Delegate调用构造函数

我发现了这个,但试图使用它并失败了。 如何使用reflection创建对象并通过将其置于委托中来加快速度? DynamicMethod dm = new DynamicMethod(“MyCtor”, t, new Type[] { }); var ctor = t.GetConstructor(new Type[] { }); ILGenerator ilgen = dm.GetILGenerator(); ilgen.Emit(OpCodes.Ldarg_0); ilgen.Emit(OpCodes.Newobj, ctor); ilgen.Emit(OpCodes.Ret); var d = (Func)dm.CreateDelegate(t); dm.Invoke(null, new object[] { }); 在把它删除之前我试图至少调用它,当我在上面做的时候我得到了错误 An unhandled exception of type ‘System.Reflection.TargetInvocationException’ occurred in mscorlib.dll 附加信息:调用目标抛出了exception。 如果我调用d()而不是我得到exception An unhandled exception of type ‘System.ArgumentException’ occurred […]

通过c#中的reflection提升事件

我想编写一个可重用的函数来通过reflection来引发事件。 搜索之后,我发现了类似的问题: 如何通过.NET / C#中的reflection来引发事件? 它一直有效,直到我向WinForm控件注册一个事件处理程序并尝试调用它。 私有字段’ ‘只是消失了。 下面是我的简化代码,它可以重现问题: Program.cs中: public static void Main() { Control control = new Control(); control.Click += new EventHandler(control_Click); MethodInfo eventInvoker = ReflectionHelper.GetEventInvoker(control, “Click”); eventInvoker.Invoke(control, new object[] {null, null}); } static void control_Click(object sender, EventArgs e) { Console.WriteLine(“Clicked !!!!!!!!!!!”); } 这是我的ReflectionHelper类: public static class ReflectionHelper { /// /// Gets method […]

在运行时计算类代码的哈希值(C#)?

是否有可能在C#中运行时计算类的哈希值(可能是通过reflection)? 为了清楚起见,我不想计算所述类的实例的哈希码,我想计算类代码本身的哈希值(如果类中的函数发生变化,我希望不同的哈希码是计算)。 理想情况下,这只会对目标代码中的更改敏感(而不仅仅是代码本身的字符串表示的哈希)。 在此先感谢您的帮助, – 布雷克