我的情况很简单.在我的代码的某处我有这个:
dynamic myVariable = GetDataThatLooksVerySimilarButNotTheSame();
//How to do this?
if (myVariable.MyProperty.Exists)
//Do stuff
Run Code Online (Sandbox Code Playgroud)
所以,基本上我的问题是如何检查(不抛出异常)我的动态变量上有某个属性可用.我可以做,GetType()但我宁愿避免,因为我真的不需要知道对象的类型.我真正想知道的是一个属性(或方法,如果让生活更轻松)是可用的.有什么指针吗?
在Java中,我们使用javaagent参数和ASM(http://asm.ow2.org/)实用程序来修改类加载器在内存中运行/加载时的字节代码.(也就是动态地向类中的方法添加方法调用).
例如,您可以删除对Log4j的所有调用以加速应用程序(http://surguy.net/articles/removing-log-messages.xml).
我试图弄清楚如何使用C#/ .Net在运行时执行相同的过程.我已经看到你可以操作.Net的CIL,但我还没有在运行时找到这个例子.
System.Reflection.Emit似乎是最接近的.Net equitant,你可以在其中动态创建类,但有没有办法使用它来添加或覆盖现有的类?
编辑:显然这是不可能的,因为C#不允许接口中的静态方法.
显然,为您自己的解决方案实现以下接口会相当简单
public interface IParsable<T>
{
T Parse(string s);
}
public interface ITryParsable<T> : IParsable<T>
{
bool TryParse(string s, out T output);
}
Run Code Online (Sandbox Code Playgroud)
已经写解析未知类型化的用户输入数据的各种方式,我会发现有int,decimal等,等实现一个版本,这些接口必不可少的.
对我而言,包含在System命名空间中似乎是一件相当明显的事情.
显然事实并非如此.那么查看类是否"实现"这些接口的最佳方法是什么?
通过Duck Typing检查方法是否存在似乎是一个明智的选择,但是反射并不是非常高效.