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?
如果某些内容不清楚或者这是重复的,请不要犹豫,发表评论.
要允许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)
如果你不知道具体的类型,你至少需要有一个可以使用的通用接口(或基类).然后将创建运行时生成的类型以实现此接口.但是,你永远只能是能够访问的成员都在编译时已知.编译器如何知道运行时字典中可能存在的所有可能键?您正在尝试针对某种合同进行编码 - 因此在接口中正式化该合同(例如),并使运行时生成的类型实现此接口.
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |