C#到VB.Net通用委托错误

时间:2014-01-16 12:49:07

标签: c# vb.net generics delegates

首先对标题感到抱歉,不太确定要放在那里。

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

而不是每次都手动进行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,知道我哪里出错了。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:0)

我认为它不在这段代码中,但可能在vb项目中错过了引用。并且您没有返回在方法Call

中设置returnClass

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

答案 1 :(得分:0)

您可能希望Dim serviceWrapper As New代替Dim serviceWrapper = New

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