c# - 动态类型转换为内部类型的通用列表

标签 c# reflection casting

我正在使用第三方 API,并且需要访问内部字段(“_fieldOfA”)的私有(private)字段(“_fieldOfB”)。下面的示例说明了该组合。我正在寻找的字段是内部类型列表(ClassCClassD 是内部类型并且位于同一程序集中)。

 public abstract class ClassA
 {
    internal ClassB _fieldOfA;
 }

 public class ClassB
 {
    private readonly List<ClassC<ClassD, int>> _fieldOfB;
 }

我尝试过反射,但我似乎无法正确转换最终类型 - 动态类型保持 Object (请注意,我的类扩展了 ClassA)

var assemblyHandle = typeof (ClassB).Assembly;
var genericTypeC = assemblyHandle.GetType("ApiNamespace.ClassC`2");
var typeD = assemblyHandle.GetType("ApiNamespace.ClassD");

var genericTypesForC = new Type[] { typeD, typeof(int) };
var typeC = genericTypeC.MakeGenericType(genericTypesForC);
var typeOfList = typeof(List<>).MakeGenericType(typeC);

var fieldOfAInfo= typeof(ClassA).GetField("_fieldOfA", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
var fieldOfAValue = fieldOfAInfo.GetValue(this);

var fieldOfBInfo= typeof(ClassB).GetField("_fieldOfB", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);
var uncastedFieldOfBValue = fieldOfBInfo.GetValue(fieldOfAValue);

dynamic fieldOfBValue = Convert.ChangeType(uncastedFieldOfBValue, typeOfList);

有什么想法吗?

最佳答案

您可以采取一些措施来更轻松地访问 List<ClassC<ClassD, int>> 中的项目(根据评论将对象转换为 IList 后)是使用 Enumerable.Cast<TResult> 列表中的扩展方法可为您提供 dynamic 的枚举物体;这样,您可以简单地让运行时为您绑定(bind)您的调用,而不是使用反射。

IList nonGenericList = uncastedFieldOfBValue as IList;
IEnumerable<dynamic> dynamicEnumerable = nonGenericList.Cast<dynamic>();

foreach (dynamic obj in dynamicEnumerable)
{
    // work with your objects here
}

当然,这只会允许您访问 public位于第三方程序集中的实例的方法和属性。如果你想玩一下内部原理,可以看one of these博客文章查看如何创建 DynamicObject允许您使用反射将调用绑定(bind)到非公共(public)成员的包装器。

关于c# - 动态类型转换为内部类型的通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16724421/

相关文章:

c# - 如何首先使用 EF 代码重置数据库迁移?

java - 将参数化类型作为参数传递给方法

C# 无法将类型 'System.Double' 的对象转换为类型 'System.Single'

java - 在 Java 中动态转换为原语

java - Java中获取类的字段名

java - 为什么 float to double cast 不精确,double to float 不精确?

c# - 你能在asp.net-mvc中强制删除(页面和partialView)OutputCache吗

c# - 以编程方式创建 'SharePoint Solution'

c# - 对实体使用泛型

java - Reflection Method.getParameterTypes() - 对象参数数组