Tag: reflection

反思说接口方法在实现类型中是虚拟的,当它们不是时?

我在unit testing中有以下代码 public bool TestMethodsOf() { var impl = typeof(T); var valid = true; foreach (var iface in impl.GetInterfaces().Where(i => typeof(I).IsAssignableFrom(i))) { var members = iface.GetMethods(); foreach (var member in members) { Trace.Write(“Checking if method ” + iface.Name + “.” + member.Name + ” is virtual…”); var implMember = impl.GetMethod(member.Name, member.GetParameters().Select(c => c.ParameterType).ToArray()); if (!implMember.IsVirtual) […]

使用Reflection确定哪些字段是属性的后备字段

我正在使用reflection来绘制对象。 这些对象在托管代码中,但除了通过reflection之外,我无法看到它们的源代码,底层结构等。 所有这一切的首要目标是一个对象的基本内存映射(类似于SOS.dll DumpObject和!ObjSize命令的function)。 因此,我试图确定哪些成员被“双重计算”为一个字段和一个属性。 例如: public class CalendarEntry { // private property private DateTime date { get; set;} // public field public string day = “DAY”; } 映射时显示: 字段 天 k__BackingField 属性 日期 像这样的一个类: public class CalendarEntry { // private field private DateTime date; // public field public string day = “DAY”; // Public […]

使用包含变量名称的字符串访问变量

我正在从数据库中读取字符串变量的名称(例如“_datafile”)。 我想知道如何使用此字符串访问程序中的命名变量。 我已经尝试过使用字典,哈希表和switch-case语句,但我想让变量动态解析。 这可能吗?

使用COM Interopreflection

在互操作之后,我找回了一个COM对象。 我知道这个对象将是三个可能的COM类之一(Class1,Class2,Class3),但不知道哪个在运行时。 对该对象的reflection(interopObject.GetType())返回System .__ ComObject的基本RCW包装器。 我需要的是在对象上设置一些属性 – Text1,Text2,… Text30(实际名称,btw :)),它们存在于所有三个类中。 所以,问题是,我可以以某种方式获取对象的运行时类型(这将解决我的问题,但可能是不可能的,因为.net运行时可能没有该信息),或者我可以设置COM对象的属性盲目地 这是我当前的代码,它失败了: for ( int i = 1; i <= 30; i++ ) { ProprertyInfo pi =interopObject.GetType().GetProperty("Text" +i.ToString()) // this returns null for pi pi.GetSetMethod().Invoke(interopObject, new object[] { someValue }); } 感谢Marc,这三个进入我的永久噱头系列: private static object LateGetValue(object obj, string propertyName) { return RuntimeHelpers.GetObjectValue(NewLateBinding.LateGet(obj, null, propertyName, new […]

如何在C#中按字符串访问类成员?

有没有办法通过字符串(名称)访问成员? 例如,如果静态代码是: classA.x = someFunction(classB.y); 但我只有两个字符串: string x = “x”; string y = “y”; 我知道在JavaScript中你可以做到: classA[x] = someFunction(classB[y]); 但是如何在C#中做到这一点? 另外,是否可以按字符串定义名称? 例如: string x = “xxx”; class{ bool x {get;set} => means bool xxx {get;set}, since x is a string } 更新 ,对于tvanfosson,我无法让它工作,它是: public class classA { public string A { get; set; } } public […]

如何在C#中的System.Type中返回System .__ COMObject的类型

我正在做一个程序,我想做一个reflection,但为此,我需要一个Type of Type类,对吧? 使用.GetProperties()方法……所以我尝试了这个: Type typeName = simObjects.getType(); 但.GetType()返回“System .__ COMObject”。 这没有用。 .typeof()也是如此。 我搜索并找到了另一个代码,这个代码: Type typeName = (Type)Microsoft.VisualBasic.Information.TypeName(simObjects); 但是这个方法返回一个String,我需要它在System.Type中,任何天才请帮帮我吗?

在LINQ中使用PropertyInfo对象查询集合

我有一个像这样的签名的方法 void RefreshMethod(IEnumerable lst, string propertyName) where T:class { Type type = typeof(T); PropertyInfo property = type.GetProperties().Single(u => u.Name == primaryKeyProperty); //query goes here } 现在我想查询该集合以获取其所有值 propertyName <0 在一个简单的场景中,它就像这样容易 lst.where(u=>u.ID<0) 但在这里我没有那个ID属性,但有相应的“PropertyInfo”对象。 我应该怎么做到这一点。 亲切的指导

给定C#类型,获取其基类和实现的接口

我正在研究C#中的游戏引擎。 我正在研究的课程名为CEntityRegistry ,它的工作是跟踪游戏中CEntity的许多实例。 我的目标是能够使用给定类型查询CEntityRegistry ,并获取该类型的每个CEntity的列表。 因此,我想做的是维护一张地图: private IDictionary<Type, HashSet> m_TypeToEntitySet; 并因此更新注册表: private void m_UpdateEntityList() { foreach (CEntity theEntity in m_EntitiesToRemove.dequeueAll()) { foreach (HashSet set in m_TypeToEntitySet.Values) { if (set.Contains(theEntity)) set.Remove(theEntity); } } foreach (CEntity theEntity in m_EntitiesToAdd.dequeueAll()) { Type entityType = theEntity.GetType(); foreach (Type baseClass in entityType.GetAllBaseClassesAndInterfaces()) m_TypeToEntitySet[baseClass].Add(theEntity); } } 我Type.GetAllBaseClassesAndInterfaces的问题是没有函数Type.GetAllBaseClassesAndInterfaces – 我将如何编写它?

财产隐藏和反思(C#)

在派生类中声明与基类中的属性名称匹配的属性“隐藏”它(除非它使用override关键字覆盖它)。 如果类型不匹配,则Type.GetProperties()将返回基类和派生类属性。 但是,如果它们的类型匹配,则只会返回派生类的属性。 例如: class A { protected double p; public int P { get { return (int)p; } set { p = value; } } } class B : A { public new int P { get { return (int)p; } set { p = value; } } } class C : B { […]

调用基类静态方法时获取Caller派生类

我想知道是否有可能(甚至通过reflection et similia)在被调用的基类静态方法中获取调用者派生类。 例如,我有一个定义了静态方法的基类: public MyBaseClass { public static void MyBaseClassStaticMethod() { /** … **/ } } 以及派生自它的类: public MyDerivedClass : MyBaseClass { } 然后我打电话给: MyDerivedClass.MyBaseClassStaticMethod() 在方法MyBaseClassStaticMethod ,是否有可能知道哪个是调用者派生类型 ? (即MyDerivedClass ) 我只需要一个字符串……