我将vb.net转换为c#.net。
时遇到了更多问题我在vb.net中有一些文件有“Option Strict Off”以允许编程错误。当我转换为c#时,我使用“dynamic”直到我回来修复问题,这在所有情况下都适用
但现在我有了这段代码:
Public Class ContractResults
'Big class definition
Public Shared Sub CleanCache()
'Code here
End Sub
End Class
在Option Strict Off的文件中:
Public Sub VerifyResults(result as Object)
'Here, result is normally ContractResults
'first it check for that then call this:
result.CleanCache()
End Sub
在c#中我使用“dynamic”,但是当我使用动态引用调用“static”方法时会弹出运行时错误。在vb.net中,我可以从实例中调用“shared”sub,但在c#中这是不允许的
例外: “Microsoft.CSharp.RuntimeBinder.RuntimeBinderException” “无法使用实例引用访问”成员'ContractTypes.ContractResults.CleanCache()';请使用类型名称限定它“
似乎我必须将代码转换为使用实际类型,但这意味着需要对更多部分进行大量重写。有人能够表现出另一种方式吗?
我想确保你认为我不能使用
(result as ContractResults).CleanCache();
因为可以传入的所有类型都具有“CleanCache()”方法,但是不从“Object”以外的任何其他类型继承。有许多类型(30!)具有这种“静态”方法,因此它使用Option Strict Off
答案 0 :(得分:2)
您可以使用reflection:
result.GetType().InvokeMember("CleanCache", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy, null, null, new object[0]);
(未经测试)
答案 1 :(得分:1)
如错误所示,您必须从类中调用静态方法,而不是实例:
ContractResults.CleanCache();
您可以将30种类型放入switch语句中,但这很难看。
答案 2 :(得分:1)
我很遗憾地说这个,但最初将Option Strict Off关闭的决定很糟糕。不知怎的,我怀疑最初编写的代码是否符合你的想法。
是时候继续解决这个问题了。