出于测试目的,我需要创建EntityDescriptor
类的实例。这不能直接完成,因为构造函数不公开。
这就是我尝试使用反射来创建实例的原因。
EdmModel model = new EdmModel();
var constructors = typeof(EntityDescriptor).GetConstructors(System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
var entityDescripto = constructors[0].Invoke(new object[] { model }) as EntityDescriptor;
我知道,该类的单个构造函数采用类型为EdmModel
的一个参数。但是当我调用上面的代码时,我遇到以下异常:
System.ArgumentException:Das Objekt mit dem Typ" Microsoft.Data.Edm.Library.EdmModel" kann nicht in den Typ" System.Data.Services.Client.ClientEdmModel" konvertiert werden。
这意味着:
类型对象" Microsoft.Data.Edm.Library.EdmModel"无法转换为类型" System.Data.Services.Client.ClientEdmModel"。
但我找不到班级ClientEdmModel
的任何地方。有人有想法吗?
答案 0 :(得分:1)
异常消息在问题上非常明确,您的对象类型错误。启动您选择的反编译器,您将看到您提到的构造函数将System.Data.Services.Client.ClientEdmModel
实例作为参数。这个类也是内部的,所以你也必须使用反射创建一个实例。这是一个创建所需对象的小例子。
var entityDescriptorType = typeof (EntityDescriptor);
//using .Assembly.GetType() on a type known to be in the right assembly
//is a fast way to get nonpublic types by fullname
var clientEdmModelType = entityDescriptorType.Assembly.GetType("System.Data.Services.Client.ClientEdmModel");
var clientEdmModelCtorArgs = new object[] {DataServiceProtocolVersion.V1};
var clientEdmModelCtor = clientEdmModelType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,
null, new[] {typeof (DataServiceProtocolVersion)}, null);
var clientEdmModelInstance = clientEdmModelCtor.Invoke(clientEdmModelCtorArgs);
var entityDescriptorCtorArgs = new[] {clientEdmModelInstance};
var entityDescriptorCtor = entityDescriptorType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,
null, new[] {clientEdmModelType}, null);
var entityDescriptorInstance = entityDescriptorCtor.Invoke(entityDescriptorCtorArgs);