转换对象的vb.net静态方法调用

时间:2010-11-30 19:14:49

标签: c# vb.net

我将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

3 个答案:

答案 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关闭的决定很糟糕。不知怎的,我怀疑最初编写的代码是否符合你的想法。

是时候继续解决这个问题了。