Tag: reflection

在运行时替换Property Setter方法

我有许多对象都共享一个公共基类,我希望拦截所有设置属性值的调用,并记录这些是否基于每个实例设置。 我可以在运行时用Reflection替换属性的Set方法吗?

使用Reflection连接到实体模型

我正在编写一个小实用程序来从程序集中加载实体数据模型并对它们进行查询。 我已经尝试使用Reflection来加载派生的ObjectContext ,但是ObjectContext并不是从MarshalByRefObject派生的,所以我不能使用Activator.CreateInstance()将参数传递给构造函数(根据我得到的exception。) 是否可以使用Reflection加载定义并存储在外部程序集中的实体模型,“后绑定”到EDM,如果提供有效的连接字符串,则对其执行查询?

.GetProperties()的大O

如果有n个属性,则是.GetProperties O(n)的Big-O,或者reflection中是否涉及增加复杂性的过程? 假设有这个定义的类: public class Reflector { public string name { get; set; } public int number { get; set; } public bool flag { get; set; } public List etc { get; set; } } 然后调用此调用: var reflect = new Reflector(); PropertyInfo[] properties = reflect.GetType().GetProperties(); .GetProperties()的时间复杂度,即Big-O是.GetProperties() ? 考虑到有4个属性,这只需要4次迭代还是比它更复杂? 或者,是否O(1)具有一些标准的复杂性来到列表 – 这似乎仍然是O(n)只是为了构建属性数组?

在设计时不知道类名创建对象

使用reflection,我需要调查用户DLL并在其中创建类的对象。 这样做的简单方法是什么?

如何获取具有指定名称的DataMemberAttribute的属性?

如何reflection性地获取具有给定名称的DataMember的属性(让我们假设每个DataMember都有一个唯一的名称)? 例如,在以下代码中,具有名称“p1”的DataMember的属性是PropertyOne : [DataContract(Name = “MyContract”)] public class MyContract { [DataMember(Name = “p1”)] public string PropertyOne { get; set; } [DataMember(Name = “p2”)] public string PropertyTwo { get; set; } [DataMember(Name = “p3”)] public string PropertyThree { get; set; } } 目前,我有: string dataMemberName = …; var dataMemberProperties = typeof(T).GetProperties().Where(p => p.GetCustomAttributes(typeof(DataMemberAttribute), false).Any()); var propInfo […]

创建未知类型的数组。 C#

在C#中使用reflection时,你应该传递一个稍后投射的参数的对象[],我有一个gui,让用户输入参数值。我知道他们希望输入什么类型的输入,int,string,float,自定义对象的实例等…如果参数是某种类型的数组int [] foo [],它允许用户构造该类型的数组,并添加/删除元素。 我不知道的是我如何使用这些信息(我知道数据的类型是类型t。)我如何构造一个数组t [],这样当它被赋予调用时,它可以转换为该数组类型。 例如,现在如果我有一个需要一个整数数组作为参数的函数,我当前正在传递一个对象[],其中有一个用整数填充的另一个对象[],但你不能只是转换对象[]到int []所以调用失败。 我不能写一个switch case,因为它不可能预测它可能是所有可能的类型(例如,在加载的dll中定义的其他类的实例)

使用单个对象上的reflection调用方法

所以我有以下内容: public class Singleton { private Singleton(){} public static readonly Singleton instance = new Singleton(); public string DoSomething(){ … } public string DoSomethingElse(){ … } } 使用reflection如何调用DoSomething方法? 我问的原因是因为我将方法名称存储在XML中并动态创建UI。 例如,我正在动态创建一个按钮并告诉它在单击按钮时通过reflection调用哪种方法。 在某些情况下,它将是DoSomething,或者在其他情况下,它将是DoSomethingElse。

System.Object的BaseType应该与接口相同吗?

摘要 typeof(ISomeInterface).BaseType为null ; typeof(object).BaseType根据定义也为null 。 从而: typeof(object).BaseType==typeof(ISomeInterface).BaseType -> true 它(语义上)可能意味着System.Object也是一个接口,不是吗? 在c#中,所有类都inheritance自System.Object ,但接口不inheritance。 接口实际上是契约,而不是任何类的基类型,并且只能从其他接口派生。 所以我想知道typeof(object).BaseType是否应该与接口相同? 说明 我认为这是基本的数学逻辑。 我将null视为0 ,将typeof(object)视为1 ,因此查找某种类型的基类型就像查找数字的因子一样。 在这种假设下, null可以是任何类型的推导,例如0是任意数的因子的倍数。 而typeof(object)将是任何类的基本类型,例如1是任何数字的因子甚至本身。 然而, typeof(object).BaseType的实际返回null打破了这个假设。 这似乎是说0是因子1而不是任何其他数字。 此外,如果我们使用一种方法递归地查找SomeType的基类型,我们不能总是说SomeType不是一个类,因为它的BaseType为null , typeof(object).BaseType也为null 。 如果这似乎是矛盾的 typeof(object).BaseType==typeof(object) -> true 提出它的基本类型本身,但实际上并不是实体和合同之间的区别? 更新: 我最初说过: 它可能意味着System.Object也是一个接口,不是吗? 我想说的是它似乎很困惑 。 这是表达不佳的描述的错误,并且很抱歉导致答案集中于此。

为什么我不能使用Reflection更改Type.Delimiter?

如果我要更改bool.TrueString的值,我会使用Reflection做到: typeof(bool).GetField(“TrueString”, BindingFlags.Public | BindingFlags.Static).SetValue(null, “Yes”); Console.WriteLine(bool.TrueString); // Outputs “Yes” 但是,我无法设置更改Type.Delimiter的值: typeof(Type).GetField(“Delimiter”, BindingFlags.Public | BindingFlags.Static).SetValue(null, ‘-‘); Console.WriteLine(Type.Delimiter); // Outputs “.” 为什么是这样?

两个属性在语义上相同的TypeIds应该是不同的还是相同的?

属性TypeId MSDN状态 : 实现时,该标识符仅是属性的类型。 但是,意图是使用唯一标识符来标识相同类型的两个属性。 但是,预期用途是区分单个属性实例(例如,与应用它们的类的不同实例相关联的那些实例),还是属于具有相同类型但由于其属性值的属性在语义上不同? 例如,假设我有以下内容: public sealed class AmpVolume : System.Attribute { public int MaxVolume { get; set; } public AmpVolume(int maxvolume) { MaxVolume = maxvolume; } } [AmpVolume(11)] public class SpinalTapGuitarAmp { } [AmpVolume(11)] public class SpinalTapBassAmp { } [AmpVolume(10)] public class RegularAmp { } 我应该将TypeId实现为 get { return (object)this; //TypeId identifies […]