Skip to content

Commit 5ca02b9

Browse files
committed
2.5.0.1
1 parent 8cfdd1e commit 5ca02b9

7 files changed

Lines changed: 82 additions & 50 deletions
-97.3 KB
Binary file not shown.
98.4 KB
Binary file not shown.

Blazor.WebForm.Components/Base/ControlComponentBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ protected void InvokePropertyBindEvent<TEventArgs, TValue>(string propertyName,
289289
try
290290
{
291291
_callbacking = true;
292-
if (_events != null && _events.TryGetEventCallbackAdapter(propertyName, callback, out EventCallbackAdapter<TValue> callbackAdapter))
292+
if (_events != null && _events.TryGetEventCallbackAdapter(propertyName, callback, out EventCallbackAdapter<TEventArgs, TValue> callbackAdapter))
293293
{
294294
callbackAdapter.InvokeAsync(value, sender, e);
295295
}

Blazor.WebForm.Components/Base/ControlComponentExtensions.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Reflection;
5+
using System.Runtime.CompilerServices;
56
using System.Text;
67
using System.Threading.Tasks;
78
using System.Web.UI;
89
using Blazor.WebForm.UI.ControlComponents;
9-
using Extensions.ComponentModel;
1010

1111
namespace Microsoft.AspNetCore.Components
1212
{
@@ -15,13 +15,13 @@ public static class ControlComponentExtensions
1515
public static void RequestRefresh<T>(this TemplateControlComponent<T> component) where T : TemplateControl, new()
1616
{
1717
component.LoadPostData();
18-
ControlComponentReflection<T>.SendMessageExtensionMethod(component, nameof(ControlComponentBase<Control>.RequestRefresh)
18+
ControlComponentReflection<T>.SendMessage(component, nameof(ControlComponentBase<Control>.RequestRefresh)
1919
, arguments: new object[] { component.Control });
2020
}
2121
private class ControlComponentReflection<T> where T : Control, new()
2222
{
23-
public delegate void SendMessageExtension(ControlComponent<T> component, string command, params object[] arguments);
24-
public static readonly SendMessageExtension SendMessageExtensionMethod = new ComponentOperator().ConvertToExtensionMethod<ControlComponent<T>, SendMessageExtension>("SendMessage", new Type[] { typeof(string), typeof(object[]) }, BindingFlags.Instance | BindingFlags.NonPublic);
23+
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = "SendMessage")]
24+
public static extern void SendMessage(ControlComponent<T> component, string command, params object[] arguments);
2525
}
2626
}
2727
}
Lines changed: 63 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,87 @@
1-
using Extensions.ComponentModel;
2-
using Microsoft.AspNetCore.Components;
1+
using Microsoft.AspNetCore.Components;
32
using System;
43
using System.Collections.Generic;
54
using System.Linq;
65
using System.Text;
6+
using System.Reflection;
7+
using System.Runtime.CompilerServices;
78
using System.Threading.Tasks;
89

910
namespace Blazor.WebForm.UI
1011
{
11-
internal class EventCallbackAdapter<TValue>
12+
internal class EventCallbackAdapter<TEventArgs, TValue>
1213
{
13-
private static readonly Getter<EventCallback<TValue>, MulticastDelegate> GetDelegate = new ComponentOperator().GetFieldGetter<EventCallback<TValue>, MulticastDelegate>("Delegate");
14-
private static readonly Getter<EventCallback<TValue>, IHandleEvent> GetReceiver = new ComponentOperator().GetFieldGetter<EventCallback<TValue>, IHandleEvent>("Receiver");
14+
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "Delegate")]
15+
private static extern ref MulticastDelegate GetDelegate(ref EventCallback<TValue> callback);
16+
[UnsafeAccessor(UnsafeAccessorKind.Field, Name = "Receiver")]
17+
private static extern ref IHandleEvent GetReceiver(ref EventCallback<TValue> callback);
18+
[UnsafeAccessor(UnsafeAccessorKind.StaticMethod, Name = "InvokeAsync")]
19+
private static extern Task InvokeAsync<T>(EventCallbackWorkItem item, MulticastDelegate @delegate, T arg);
1520

16-
private readonly EventCallback<TValue> _callback;
17-
private readonly MulticastDelegate _eventHandler;
21+
private readonly Lazy<Func<object, Task>> _delegateInvoke;
1822

19-
private MulticastDelegate Delegate
20-
{
21-
get
22-
{
23-
return GetDelegate(_callback);
24-
}
25-
}
26-
27-
private IHandleEvent Receiver
23+
public EventCallbackAdapter(EventCallback<TValue> callback, MulticastDelegate eventHandler)
2824
{
29-
get
25+
_delegateInvoke = new Lazy<Func<object, Task>>(() =>
3026
{
31-
return GetReceiver(_callback);
32-
}
27+
EventCallbackWorkItem item = GetItem(GetDelegate(ref callback), eventHandler);
28+
IHandleEvent receiver = GetReceiver(ref callback);
29+
if (receiver != null)
30+
{
31+
return arg => receiver.HandleEventAsync(item, arg);
32+
}
33+
else
34+
{
35+
return item.InvokeAsync;
36+
}
37+
});
3338
}
3439

35-
public EventCallbackAdapter(EventCallback<TValue> callback, MulticastDelegate eventHandler)
40+
public Task InvokeAsync(TValue value, object sender, TEventArgs e)
3641
{
37-
_callback = callback;
38-
_eventHandler = eventHandler;
42+
return _delegateInvoke.Value.Invoke((value, sender, e));
3943
}
4044

41-
public Task InvokeAsync(TValue value, params object[] eventArgs)
45+
private static EventCallbackWorkItem GetItem(MulticastDelegate @delegate, MulticastDelegate eventHandler)
4246
{
43-
EventCallbackWorkItem item = new EventCallbackWorkItem(this.DelegateInvoke);
44-
object arg = (value, eventArgs);
45-
IHandleEvent receiver = this.Receiver;
46-
return receiver != null ? receiver.HandleEventAsync(item, arg) : item.InvokeAsync(arg);
47+
Func<object, TEventArgs, Task> invokeAsync = GetInvokeAsync(eventHandler);
48+
return new EventCallbackWorkItem(async (object arg) =>
49+
{
50+
(TValue value, object sender, TEventArgs e) = ((TValue, object, TEventArgs))arg;
51+
await InvokeAsync(default(EventCallbackWorkItem), @delegate, value);
52+
await invokeAsync.Invoke(sender, e);
53+
});
4754
}
4855

49-
private void DelegateInvoke((TValue value, object[] eventArgs) arg)
56+
private static Func<object, TEventArgs, Task> GetInvokeAsync(MulticastDelegate eventHandler)
5057
{
51-
this.Delegate?.DynamicInvoke(arg.value);
52-
_eventHandler?.DynamicInvoke(arg.eventArgs);
58+
return eventHandler switch
59+
{
60+
null => (sender, e) => Task.CompletedTask,
61+
EventHandler handler => (sender, e) =>
62+
{
63+
handler.Invoke(sender, e as EventArgs);
64+
return Task.CompletedTask;
65+
}
66+
,
67+
EventHandler<TEventArgs> handler => (sender, e) =>
68+
{
69+
handler.Invoke(sender, e);
70+
return Task.CompletedTask;
71+
}
72+
,
73+
_ => (sender, e) =>
74+
{
75+
try
76+
{
77+
return eventHandler?.DynamicInvoke(sender, e) as Task ?? Task.CompletedTask;
78+
}
79+
catch (TargetInvocationException ex)
80+
{
81+
return Task.FromException(ex.InnerException);
82+
}
83+
}
84+
};
5385
}
5486
}
55-
}
87+
}

Blazor.WebForm.Components/Base/EventHandlerDictionary.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ private abstract class EventProperty
1414
{
1515
private readonly Func<bool> _inSetParams;
1616

17-
public abstract object Handler { get; set; }
17+
public abstract MulticastDelegate Handler { get; set; }
1818

19-
public abstract object BindHandler { get; set; }
19+
public abstract MulticastDelegate BindHandler { get; set; }
2020

2121
public abstract bool IsEmpty { get; }
2222

@@ -48,7 +48,7 @@ private class GeneralEventProperty : EventProperty
4848
private EventHandler _bindHandler;
4949
private bool _invoking;
5050

51-
public override object Handler
51+
public override MulticastDelegate Handler
5252
{
5353
get
5454
{
@@ -60,7 +60,7 @@ public override object Handler
6060
}
6161
}
6262

63-
public override object BindHandler
63+
public override MulticastDelegate BindHandler
6464
{
6565
get
6666
{
@@ -137,7 +137,7 @@ private class EventProperty<TEventArgs> : EventProperty
137137
private EventHandler<TEventArgs> _bindHandler;
138138
private bool _invoking;
139139

140-
public override object Handler
140+
public override MulticastDelegate Handler
141141
{
142142
get
143143
{
@@ -149,7 +149,7 @@ public override object Handler
149149
}
150150
}
151151

152-
public override object BindHandler
152+
public override MulticastDelegate BindHandler
153153
{
154154
get
155155
{
@@ -266,7 +266,7 @@ public void SetEventProperty<TEventArgs>(EventHandler<TEventArgs> handler, Actio
266266
this.SetEventProperty(handler, this.CreateEventProperty, (add, remove), propertyName);
267267
}
268268

269-
private void SetEventProperty<TArg>(object handler, Func<string, TArg, EventProperty> eventPropertyFactory, TArg factoryArgument, string propertyName)
269+
private void SetEventProperty<TArg>(MulticastDelegate handler, Func<string, TArg, EventProperty> eventPropertyFactory, TArg factoryArgument, string propertyName)
270270
{
271271
EventProperty eventProperty;
272272
if (handler != null)
@@ -294,7 +294,7 @@ public void SetBindEventProperty<TEventArgs>(string propertyName, EventHandler<T
294294
this.SetBindEventProperty(propertyName, bindHandler, this.CreateEventProperty, (add, remove));
295295
}
296296

297-
private void SetBindEventProperty<TArg>(string propertyName, object bindHandler, Func<string, TArg, EventProperty> eventPropertyFactory, TArg factoryArgument)
297+
private void SetBindEventProperty<TArg>(string propertyName, MulticastDelegate bindHandler, Func<string, TArg, EventProperty> eventPropertyFactory, TArg factoryArgument)
298298
{
299299
EventProperty eventProperty;
300300
if (bindHandler != null)
@@ -326,11 +326,11 @@ private EventProperty CreateEventProperty<TEventArgs>(string propertyName, (Acti
326326
return eventProperty;
327327
}
328328

329-
public bool TryGetEventCallbackAdapter<TValue>(string propertyName, EventCallback<TValue> callback, out EventCallbackAdapter<TValue> callbackAdapter)
329+
public bool TryGetEventCallbackAdapter<TEventArgs, TValue>(string propertyName, EventCallback<TValue> callback, out EventCallbackAdapter<TEventArgs, TValue> callbackAdapter)
330330
{
331331
if (_events.TryGetValue(propertyName, out EventProperty eventProperty) && eventProperty.IsBoth)
332332
{
333-
callbackAdapter = new EventCallbackAdapter<TValue>(callback, eventProperty.Handler as MulticastDelegate);
333+
callbackAdapter = new EventCallbackAdapter<TEventArgs, TValue>(callback, eventProperty.Handler);
334334
return true;
335335
}
336336
callbackAdapter = null;

Blazor.WebForm.Components/Blazor.WebForm.Components.csproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
22

33
<PropertyGroup>
4-
<TargetFramework>net8.0</TargetFramework>
4+
<TargetFramework>net9.0</TargetFramework>
55
<SignAssembly>true</SignAssembly>
66
<AssemblyOriginatorKeyFile>Blazor.WebForm.Components.pfx</AssemblyOriginatorKeyFile>
7-
<Version>2.4.1.3</Version>
7+
<Version>2.5.0.1</Version>
88
<RootNamespace>asp</RootNamespace>
99
<Copyright>Jurio li</Copyright>
1010
<AssemblyName>Blazor.WebForm.Components</AssemblyName>
@@ -17,8 +17,8 @@
1717

1818
<ItemGroup>
1919
<PackageReference Include="Applied" Version="1.2.1.8" />
20-
<PackageReference Include="Blazor.WebForm.UI" Version="2.4.1.3" />
21-
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="8.0.8" />
20+
<PackageReference Include="Blazor.WebForm.UI" Version="2.5.0.1" />
21+
<PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="9.0.1" />
2222
</ItemGroup>
2323

2424
<ItemGroup>

0 commit comments

Comments
 (0)