1

有没有办法做到这一点:

protected void SubscribeToEvent<TEvent, TPayload>(Action<TPayload> a_action)
    where TEvent : CompositePresentationEvent<TPayload>
{
    TEvent newEvent = _eventAggregator.GetEvent<TEvent>();
    SubscriptionToken eventToken = newEvent.Subscribe(a_action);

    _lstEventSubscriptions.Add(new KeyValuePair<EventBase, SubscriptionToken>(newEvent, eventToken));
}

不需要用户指定TPayload参数?

4

2 回答 2

2

不,没有。不在 C# 4 中。你不能用单一方法做到这一点。

TEvent不能从传递给方法的参数中推断出来,并且由于泛型类型参数不能使用部分推断,因此您必须在调用站点手动指定类型参数。

于 2010-12-29T18:10:51.787 回答
0

信不信由你,VB.NET的扩展方法与此非常相似。

假设我有以下扩展方法:

<Extension()>
Function Append(Of TInferred, T)(ByVal source As IEnumerable(Of TInferred)) As Object()
    Dim items As List(Of Object) = source.Cast(Of Object).ToList()

    Dim value As T = Nothing ' equivalent to default(T) '
    items.Add(value)

    Return items.ToArray()
End Function

然后我实际上可以调用这个方法传递单个类型参数,T仅用于TInferred推断:

Dim strings = New String() {"A", "B", "C"}

' Notice I am passing only one type argument. '
Dim objects = strings.Append(Of Integer)()

For Each obj As Object In objects
    Console.WriteLine(obj)
Next

输出:

一种
乙
C
0

遗憾的是,正如 Mehrdad 所指出的,这在 C# 中是不可能的。

于 2010-12-29T19:45:01.067 回答