制作带有反射的新对象



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

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

样本代码

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();

如果你不知道具体的类型,你至少需要有一个可以使用的公共接口(或基类(。然后将创建运行时生成的类型来实现此接口。但您只能访问编译时所知的成员。编译器如何知道运行时字典中可能存在的所有键?您正试图根据某种约定进行编码,因此在接口中形式化该约定(例如(,并使运行时生成的类型实现该接口。

相关内容

  • 没有找到相关文章

最新更新