【问题标题】:Convert vb.net static method call on object转换对象上的 vb.net 静态方法调用
【发布时间】:2010-11-30 19:14:49
【问题描述】:

我在将 vb.net 转换为 c#.net 时遇到了更多问题。

我在 vb.net 中有一些文件具有“Option Strict Off”以允许不良编程。当我转换为 c# 时,我使用“动态”,直到我回来解决问题,这适用于所有情况

但现在我有这个代码:

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# 中我使用“动态”,但是当我使用动态引用调用“静态”方法时会弹出运行时错误。在 vb.net 中,我可以从实例中调用“共享”子,但在 c# 中这是不允许的

例外: “Microsoft.CSharp.RuntimeBinder.RuntimeBinderException” "不能使用实例引用访问成员 'ContractTypes.ContractResults.CleanCache()';改为使用类型名称对其进行限定"

看来我必须将代码转换为使用实际类型,但这意味着要重写更多部分。有没有人可以展示另一种方式?

我想确保你不认为我可以使用

(result as ContractResults).CleanCache();

因为所有可能传入的类型都有“CleanCache()”方法,但不继承自“Object”以外的任何相同的东西。有许多类型(30 种!)具有这种“静态”方法,这就是它使用 Option Strict Off 的原因

【问题讨论】:

  • 对于 30 种类型,我只需打开 Option Strict On 并在 VB 中修复它。 IDE 将为您提供每个警告,您应该能够非常快速地完成所有操作。

标签: c# vb.net


【解决方案1】:

你可以使用reflection:

result.GetType().InvokeMember("CleanCache", BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy, null, null, new object[0]);

(未测试

【讨论】:

  • 这项工作:我必须添加“BindingFlags.InvokeMember”。在此运行的循环中的一个问题似乎是代码变慢了,但我喜欢它的转换——在我看来,转换错误的代码变成了错误的转换代码。我会投票,但我不是足够好的用户。
  • 赞成,因为这足以让 OP 继续工作。
【解决方案2】:

正如错误提示,您必须从类中调用静态方法,而不是实例:

ContractResults.CleanCache();

你可以把你的 30 种类型放到一个 switch 语句中,但这会很丑。

【讨论】:

    【解决方案3】:

    我很抱歉这么说,但最初关闭 Option Strict 的决定很糟糕。不知何故,我怀疑最初编写的代码是否符合您的想法。

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

    【讨论】:

    • 我也是这么想的,但是不会增加转换时间表来修复旧的错误代码。我仍然会投票给你(但我不是足够好的用户)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2016-09-13
    • 1970-01-01
    • 2013-03-12
    • 2014-03-09
    • 2011-06-19
    • 2021-12-10
    相关资源
    最近更新 更多