有没有办法做到这一点:
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
参数?
答案 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#中是不可能的。