我不确定这是否可能,经过长时间的研究,我还没有找到结论性的东西。
我正在尝试从字典中动态地创建一个新对象(本身就是一个新类型(。假设我有键和值,键和值将成为返回值的属性。我可以这样使用的东西:
样本代码
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的项目中工作?
如果有什么不清楚的地方或这是重复的,请毫不犹豫地发表评论
若要允许IntelliSense工作,结果类型必须在编译时已知。因此,在使用object
时,您必须知道它的具体类型(或者,至少是一个您需要的具体类型或接口——具有您想要访问的所有方法和属性(。
很难看出你实际上在尝试做什么,但如果你在编译时确实知道类型,你可以使你的助手方法通用:
public T GetObject<T>(Dictionary<...> dictionary)
这允许您指定您在呼叫站点期望的类型:
var obj = GetObject<SomeType>(dictionary);
如果这听起来不合理,你也可以使用显式强制转换:
var obj = (SomeType)helper.getObject();
如果你不知道具体的类型,你至少需要有一个可以使用的公共接口(或基类(。然后将创建运行时生成的类型来实现此接口。但您只能访问编译时为所知的成员。编译器如何知道运行时字典中可能存在的所有键?您正试图根据某种约定进行编码,因此在接口中形式化该约定(例如(,并使运行时生成的类型实现该接口。