如何创建EntityDescriptor类的实例

时间:2016-06-27 10:02:05

标签: c# wcf reflection

出于测试目的,我需要创建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的任何地方。有人有想法吗?

1 个答案:

答案 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);