【问题标题】:C# to VB.Net Generic Delegate ErrorC# 到 VB.Net 通用委托错误
【发布时间】:2014-01-16 12:49:07
【问题描述】:

首先对标题感到抱歉,不太确定该放什么。

背景 需要在服务上调用各种方法,但是服务要求我们在每次操作调用之前先登录,然后再注销。

因此,与其每次手动进行 3 次调用,不如认为使用泛型会很有用。

代码和问题

在 C# 中 写了一个ServiceCaller类

public class ServiceCaller<T>
{
    private T instance;

    public ServiceCaller(T param)
    {
        this.instance = param;
    }

    public void Call<U>(Func<T, U> aExpression, Action<U> returnClass)
    {
        Authentication authenticate = new Authentication();
        if (authenticate.Login())
        {
            U result = aExpression(this.instance);
            returnClass(result);
        }
    }
}

然后是一个有实际实现的类

public class MFMPlanActions
{
    public string GetPromotionPlans(PromotionPlan plan)
    {
        PromotionPlan plan = new Promotion()
        Do Stuff
        return plan
    }
}

后面的网页代码是这样的

var serviceWrapper = new ServiceTest.ServiceCaller<ServiceTest.MFMPlanActions> 
    (new ServiceTest.MFMPlanActions());
serviceWrapper.Call(x => x.GetPromotionPlans(plan), u => Console.WriteLine(u)); 

在 C# 中效果很好,但在 VB.net 中效果很好

最后一点不行

转换后的代码是

Dim serviceWrapper = New API.ServiceCaller(Of API.MFMPlanActions)(New API.MFMPlanActions())
serviceWrapper.[Call](Function(x) x.GetPromotionPlans(plan), Function(u) Console.WriteLine(u))

在线

serviceWrapper.[Call](Function(x) x.GetPromotionPlans(plan), Function(u) Console.WriteLine(u))

我得到:对象引用未设置为对象的实例

我对 VB.net 的熟悉程度不足以知道我哪里出错了。

谁能帮忙?

【问题讨论】:

  • 您确定ServiceTest.ServiceCallerAPI.ServiceCaller 相同吗?这是我能看到的唯一区别。此外,您可能想要Dim serviceWrapper As New 而不是Dim serviceWrapper = New。不应该在这里做交易,只是VB.NET中的一个声明标准。
  • 嗨。是的,它们是相同的,只是为实际项目重命名,以便命名更好:)
  • 好吧有趣我改变了 Dim serviceWrapper = TO Dim serviceWrapper As New,我现在在下面的行上得到以下错误 方法'Public Sub Call 中类型参数的数据类型(Of U)(aExpression As System.Func(Of T, U))' 不能从这些参数中推断出来。明确指定数据类型可能会更正此错误。
  • VB.NET 通常比 C# 更明确,尤其是 Option Infer OffOption Strict On。尝试在源文件的顶部设置这些。开始向您的语句显式添加类型,看看错误何时消失。应用这些代码后,您可能还会注意到代码的其他部分存在问题。但是,修复它们应该可以帮助您避免在运行时出现问题。
  • Neolisk- 你是明星!将 = 更改为 As 然后对错误进行排序使其工作!我不能;不能将此标记为答案,所以将其全部放在下面

标签: c# vb.net generics delegates


【解决方案1】:

你可能想要Dim serviceWrapper As New而不是Dim serviceWrapper = New

VB.NET 通常比 C# 更明确,尤其是 Option Infer OffOption Strict On。尝试在源文件的顶部设置这些。开始向您的语句显式添加类型,看看错误何时消失。应用这些代码后,您可能还会注意到代码的其他部分存在问题。但是,修复它们应该可以帮助您避免在运行时出现问题。

【讨论】:

  • 感谢将 = 更改为 New 并将所有返回值内容重新注释以消除错误并且它可以工作。谢谢
  • @user1466569:也感谢您的接受。您还可以对您认为有用的任何答案进行投票。只能接受一个答案,但是,可以对一个问题提出多个答案。见more about upvoting here
  • 对此有另一个简短的问题...我的最后一行现在看起来像这样并且效果很好 serviceWrapper.Call(Function(x) x.GetPromotionPlans(req), Function(u) u).. .但我需要将返回数据(在 u 中)分配给局部变量,以便我可以使用...我该怎么做?
  • @user1466569:你的意思是Function(x) x.GetPromotionPlans(req)的内容?
  • 没有U是函数调用返回的数据,我需要这个数据
【解决方案2】:

我不认为它在这段代码中,但可能在 vb 项目中缺少参考。并且您没有返回在方法 Call 中设置 returnClass

尝试将 else 语句中的 returnClass 设置为任何内容,以查看错误是否消失,然后我们可以从那里开始

【讨论】:

  • 在 vb.net 中,returnclass 的东西被注释掉了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多