如何在where子句中使用泛型创建泛型方法? (男人那很明显是泥!)

时间:2010-12-29 18:08:51

标签: c# generics eventaggregator

有没有办法做到这一点:

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参数?

2 个答案:

答案 0 :(得分:2)

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

无法从传递给方法的参数推断出

TEvent,并且由于部分推断不适用于泛型类型参数,因此您必须在调用站点手动指定类型参数。

答案 1 :(得分: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

输出:

A
B
C
0

可悲的是,as Mehrdad has indicated,这在C#中是不可能的。