【发布时间】: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.ServiceCaller与API.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 Off和Option Strict On。尝试在源文件的顶部设置这些。开始向您的语句显式添加类型,看看错误何时消失。应用这些代码后,您可能还会注意到代码的其他部分存在问题。但是,修复它们应该可以帮助您避免在运行时出现问题。 -
Neolisk- 你是明星!将 = 更改为 As 然后对错误进行排序使其工作!我不能;不能将此标记为答案,所以将其全部放在下面
标签: c# vb.net generics delegates