用反射制作新物体?

Joz*_*oze 0 c# intellisense dynamic clay impromptu-interface

我不确定这是否可行,经过漫长的研究,我没有找到确凿的结论.

我试图从字典中动态创建一个新对象(本身是一个新类型).所以说我有键和值,键和值将成为返回值的属性.我可以这样使用的东西:

示例代码

public T getObject(Dictionary<string, string> myDict)
{
 // make a new object type with the keys and values of the dictionary. 
 // sample values in dictionary:
 // id : 112345
 // name: "greg"
 // gender: "m"
 // Eventually also make the interface?
}

// Somewhere else:
var myNewObject = helper.getObject();
// what is expected here is that when I type myNewObject. 
// I get id, name, gender as suggestions
int id = myNewObject.Id;
Run Code Online (Sandbox Code Playgroud)

对我来说重要的是从中获取智能感知.所以我可以输出object.所有键的类型和建议.这样我就不需要提前知道字典才能访问这些值(否则我只会使用字典).

我已经看过Clay了,但我不清楚如何使用它来获得我想要的intellisense.我也发现了这篇关于它的帖子.

另外我检查了ImpromptuInterface,但是两个文档都很差或我无法弄明白.

如果Clay可以实现这一点(看起来确实如此)我怎么能这样做呢?它可以作为其他项目的库而不是Clay?

如果某些内容不清楚或者这是重复的,请不要犹豫,发表评论.

Lua*_*aan 5

要允许IntelliSense工作,必须在编译时知道结果类型.所以在你工作的时候object,你必须知道它的具体类型(或者,至少,你需要具体的类型或接口 - 拥有你想要访问的所有方法和属性).

这是很难看到你实际上要做的,但如果你知道在编译时的类型,你可以让你的helper方法的通用:

public T GetObject<T>(Dictionary<...> dictionary)
Run Code Online (Sandbox Code Playgroud)

这允许您指定呼叫站点期望的类型:

var obj = GetObject<SomeType>(dictionary);
Run Code Online (Sandbox Code Playgroud)

如果这对您来说听起来不合理,您还可以使用显式强制转换:

var obj = (SomeType)helper.getObject();
Run Code Online (Sandbox Code Playgroud)

如果你不知道具体的类型,你至少需要有一个可以使用的通用接口(或基类).然后将创建运行时生成的类型以实现此接口.但是,你永远只能是能够访问的成员在编译时已知.编译器如何知道运行时字典中可能存在的所有可能键?您正在尝试针对某种合同进行编码 - 因此在接口中正式化该合同(例如),并使运行时生成的类型实现此接口.