Is there a way of doing this:
protected void SubscribeToEvent<TEvent, TPayload>(Action<TPayload> a_action)开发者_StackOverflow社区
where TEvent : CompositePresentationEvent<TPayload>
{
TEvent newEvent = _eventAggregator.GetEvent<TEvent>();
SubscriptionToken eventToken = newEvent.Subscribe(a_action);
_lstEventSubscriptions.Add(new KeyValuePair<EventBase, SubscriptionToken>(newEvent, eventToken));
}
without requiring the user to specify a TPayload
parameter?
No, there isn't. Not in C# 4. You can't do that with a single method.
TEvent
cannot be inferred from the arguments passed to the method, and since partial inference is not available for generic type arguments, you'll have to manually specify the type argument at call site.
Believe it or not, VB.NET has something very much like this for extension methods.
Say I have the following extension method:
<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
Then I could actually call this method passing a single type parameter, for T
only, with TInferred
being inferred:
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
Output:
A B C 0
Sadly, as Mehrdad has indicated, this is not possible in C#.
精彩评论