C# 当其中一个参数是动态的时,如何获取类型的构造函数?

C# 当其中一个参数是动态的时,如何获取类型的构造函数?,c#,dynamic,reflection,constructor,C#,Dynamic,Reflection,Constructor,我有一系列使用此构造函数的类: MyClass(Reader reader, dynamic json) { ... } 我需要在泛型方法中实例化对象。为此,我尝试获取构造函数thuswise: class Reader ... T Get<T>(string id) { dynamic json = GetData(id); var constructor = typeof(T).GetConstructor(new Type

我有一系列使用此构造函数的类:

MyClass(Reader reader, dynamic json)  { ... }
我需要在泛型方法中实例化对象。为此,我尝试获取构造函数thuswise:

class Reader
...
T  Get<T>(string id)
    {
    dynamic  json        = GetData(id);
    var      constructor = typeof(T).GetConstructor(new Type[] { typeof(Reader), typeof(dynamic) });
    return constructor.Invoke(new object[] { this, json });
    }
我还可以调用
GetConstructors()
并获取第一个条目,因为这些类只有一个条目,但这很脆弱

但是,在这种情况下,
dynamic
typeof(dynamic)
都是不可接受的

考虑使用
typeof(object)
而不是
typeof(dynamic)

说的是动态的

在大多数情况下,它的功能就像它有类型对象一样

特别是,以下代码失败,错误为“Type'..JsonWrapper'已经使用相同的参数类型定义了一个名为“JsonWrapper”的成员”


没有欢乐;调用
GetConstructor(新类型[]{typeof(Reader),typeof(object)})”返回
null
。我确实记得把我的构造函数sig改回
Reader,dynamic`.@JonofAllTrades你的意思是如果你有一个构造函数
JsonWrapper(object)
,那么你可以用
GetConstructor
检索它,但是如果你把签名改成
JsonWrapper(dynamic)
它不再工作了?我的解决方法是让构造函数接受
Reader、JsonWrapper
作为参数;如果是这样,我可以调用
GetConstructor(新类型[]{typeof(Reader),typeof(JsonWrapper)})
。这有点困难,所以(按照您的建议)我尝试将构造函数改回我开始使用的
GetConstructor(新类型[]{typeof(Reader),typeof(object)})
。但是,这返回null,意味着找不到匹配的构造函数。@JonofAllTrades我尝试过,如果MyClass构造函数是公共的,它似乎对我有效,如果它是私有的,它将失败。这会是你的案子吗?您可以使用另一个
GetConstructor
重载来检索私有构造函数。施工人员一直是
内部的
。因此将返回一个
public-Ctor(dynamic)
internal-Ctor(SomeClass)
构造函数,但
internal-Ctor(dynamic)
不会返回。奇怪的
class JsonWrapper
{
JsonWrapper(dynamic json) { Json = json; }
dynamic  Json  { get;  private set; }
}
...
var  constructor = typeof(T).GetConstructor(new Type[] { typeof(Reader), typeof(JsonWrapper) });
public class JsonWrapper
{
    public JsonWrapper(dynamic json) { }
    public JsonWrapper(object json) { }
}