0

我不确定这是否可能,经过长时间的研究,我还没有找到结论性的东西。

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

示例代码

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;

对我来说重要的是从中获得智能感知。因此,我可以输入object.所有键并提出建议。这样我就不需要提前知道字典来访问这些值(否则我会简单地使用字典)。

我已经研究过Clay,但我不清楚如何使用它来获得我想要的智能感知。我也找到了这篇关于它的帖子。

此外,我检查了ImpromptuInterface但这两个文档都很差,或者我无法弄清楚。

如果 Clay 可以做到这一点(看起来确实如此),我该怎么做才能让它在其他不引用 Clay 的项目中作为库工作?

如果有不清楚的地方或这是重复的,请不要犹豫发表评论。

4

1 回答 1

5

要允许 IntelliSense 工作,生成的类型必须在编译时已知。因此,在您使用 时object,您必须知道它的具体类型(或者,至少是您需要的具体类型或接口——拥有您想要访问的所有方法和属性)。

很难看出你实际上想要做什么,但如果你编译时知道类型,你可以让你的辅助方法通用:

public T GetObject<T>(Dictionary<...> dictionary)

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

var obj = GetObject<SomeType>(dictionary);

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

var obj = (SomeType)helper.getObject();

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

于 2015-07-02T10:06:31.543 回答