Observable.FromEvent 自定义事件转换无法编译并出现错误 "Method name expected"
Observable.FromEvent custom event transform won't compile with error "Method name expected"
我在 .net 核心和完整的 fw v4.7.2 中创建了错误。使用任何版本的 c# 和随附的响应式扩展。
using System.Reactive.Linq;
namespace ObservableTest
{
internal class Program
{
public delegate void _test(int vs, byte bs);
internal class _TestParamList { public int vs1; public byte bs1; }
static void Main(string[] args)
{
var obs_test = Observable.FromEvent<_test, _TestParamList>(
OnNext => new _test((vs, bs)
=> OnNext(new _TestParamList { vs1 = a, bs1 = b }),
h => _test += h,
h => _test -= h));
}
}
}
以上代码无法编译并给出错误“预期的方法名称”,以 (vs,bs) 开头并转到列表中的最后一个 h。
我正在尝试对我无法重写的事件实施转换,该事件具有两个数组、一个 int 和一个日期时间值。
我从这个答案中得到了灵感:
在 link 中,我提供了我用作解决方案的模型,但我没有看到 FromEvent 声明的最后两行,如下所示:
handler => axCZKEM.OnAttTransactionEx += handler,
handler => axCZKEM.OnAttTransactionEx -= handler);
axCZKEM 对象是事件源。
在系统中,我试图构建该源已经存在,但我没有在我的 OP 示例中创建它。为了纠正这个问题,我从这里借用了一个制造事件源的例子:How to use Observable.FromEvent instead of FromEventPattern and avoid string literal event names
以上 link 是有关事件和 FromEvent 方法的一般信息的良好来源。
有关假装事件源,请参阅 class Foo。
我稍微重写了转换以获得下面的代码。
我不必在 FromEvent 方法中添加新的事件源,而是需要编写一个名为 ShowParamList 的“事件处理程序”来向自己证明我可以访问事件提供的各种值。
using System;
using System.Reactive.Linq;
namespace ObservableTest
{
internal class Program
{
public delegate void EventTest(int vs, string bs);
internal class TestParamList { public int vs1; public string bs1; }
static void Main(string[] args)
{
var EventSource = new TestEventSource();
var obs_test = Observable.FromEvent<EventTest, TestParamList>(
OnNext => (int vs, string bs) => OnNext(new TestParamList { vs1 = vs, bs1 = bs }),
h => EventSource.MyEvent += h,
h => EventSource.MyEvent -= h);
obs_test.Subscribe(x => ShowParamList(x));
EventSource.RaiseEvent(1, "first");
EventSource.RaiseEvent(2, "second");
Console.ReadKey();
}
static void ShowParamList(TestParamList t)
{
Console.WriteLine("Int: " + t.vs1.ToString() + " String: " + t.bs1.ToString());
}
public class TestEventSource
{
private EventTest delegateChain;
public event EventTest MyEvent
{
add
{
delegateChain += value;
}
remove
{
delegateChain -= value;
}
}
public void RaiseEvent(int x, string y)
{
var temp = delegateChain;
if (temp != null)
{
delegateChain(x, y);
}
}
}
}
}
我在 .net 核心和完整的 fw v4.7.2 中创建了错误。使用任何版本的 c# 和随附的响应式扩展。
using System.Reactive.Linq;
namespace ObservableTest
{
internal class Program
{
public delegate void _test(int vs, byte bs);
internal class _TestParamList { public int vs1; public byte bs1; }
static void Main(string[] args)
{
var obs_test = Observable.FromEvent<_test, _TestParamList>(
OnNext => new _test((vs, bs)
=> OnNext(new _TestParamList { vs1 = a, bs1 = b }),
h => _test += h,
h => _test -= h));
}
}
}
以上代码无法编译并给出错误“预期的方法名称”,以 (vs,bs) 开头并转到列表中的最后一个 h。
我正在尝试对我无法重写的事件实施转换,该事件具有两个数组、一个 int 和一个日期时间值。
我从这个答案中得到了灵感:
在 link 中,我提供了我用作解决方案的模型,但我没有看到 FromEvent 声明的最后两行,如下所示:
handler => axCZKEM.OnAttTransactionEx += handler,
handler => axCZKEM.OnAttTransactionEx -= handler);
axCZKEM 对象是事件源。
在系统中,我试图构建该源已经存在,但我没有在我的 OP 示例中创建它。为了纠正这个问题,我从这里借用了一个制造事件源的例子:How to use Observable.FromEvent instead of FromEventPattern and avoid string literal event names
以上 link 是有关事件和 FromEvent 方法的一般信息的良好来源。
有关假装事件源,请参阅 class Foo。
我稍微重写了转换以获得下面的代码。 我不必在 FromEvent 方法中添加新的事件源,而是需要编写一个名为 ShowParamList 的“事件处理程序”来向自己证明我可以访问事件提供的各种值。
using System;
using System.Reactive.Linq;
namespace ObservableTest
{
internal class Program
{
public delegate void EventTest(int vs, string bs);
internal class TestParamList { public int vs1; public string bs1; }
static void Main(string[] args)
{
var EventSource = new TestEventSource();
var obs_test = Observable.FromEvent<EventTest, TestParamList>(
OnNext => (int vs, string bs) => OnNext(new TestParamList { vs1 = vs, bs1 = bs }),
h => EventSource.MyEvent += h,
h => EventSource.MyEvent -= h);
obs_test.Subscribe(x => ShowParamList(x));
EventSource.RaiseEvent(1, "first");
EventSource.RaiseEvent(2, "second");
Console.ReadKey();
}
static void ShowParamList(TestParamList t)
{
Console.WriteLine("Int: " + t.vs1.ToString() + " String: " + t.bs1.ToString());
}
public class TestEventSource
{
private EventTest delegateChain;
public event EventTest MyEvent
{
add
{
delegateChain += value;
}
remove
{
delegateChain -= value;
}
}
public void RaiseEvent(int x, string y)
{
var temp = delegateChain;
if (temp != null)
{
delegateChain(x, y);
}
}
}
}
}