diff --git a/src/Temporalio/Activities/ActivityDefinition.cs b/src/Temporalio/Activities/ActivityDefinition.cs index 9b501d5a..a52cfaea 100644 --- a/src/Temporalio/Activities/ActivityDefinition.cs +++ b/src/Temporalio/Activities/ActivityDefinition.cs @@ -126,6 +126,10 @@ public static ActivityDefinition Create(MethodInfo method, Func(false) ?? throw new ArgumentException($"{method} missing Activity attribute"); + if (method.ContainsGenericParameters) + { + throw new ArgumentException($"{method} contains generic parameters"); + } var parms = method.GetParameters(); return Create( NameFromAttributed(method, attr), diff --git a/tests/Temporalio.Tests/Activities/ActivityDefinitionTests.cs b/tests/Temporalio.Tests/Activities/ActivityDefinitionTests.cs index 18e88e6e..5e764ecc 100644 --- a/tests/Temporalio.Tests/Activities/ActivityDefinitionTests.cs +++ b/tests/Temporalio.Tests/Activities/ActivityDefinitionTests.cs @@ -156,6 +156,23 @@ public async Task CreateAll_ClassOfStaticActivities_CanInvoke() Assert.Equal(128, await defn.InvokeAsync(new object?[] { 123 })); } + [Fact] + public void CreateAll_OpenGeneric_Throws() + { + var exc = Assert.ThrowsAny(() => ActivityDefinition.CreateAll( + typeof(BadActivityGeneric), new BadActivityGeneric())); + Assert.Contains("contains generic parameters", exc.Message); + } + + [Fact] + public async Task CreateAll_ClosedGeneric_CanInvoke() + { + var defn = ActivityDefinition.CreateAll( + typeof(GoodActivityGeneric), + new GoodActivityGeneric("some-val")).Single(); + Assert.Equal("some-val", await defn.InvokeAsync(Array.Empty())); + } + protected static void BadAct1() { } @@ -174,6 +191,22 @@ public static class GoodActivityClassStatic public static int MyActivity(int param) => param + 5; } + public class BadActivityGeneric + { + [Activity] + public T BadActAsync() => throw new NotSupportedException(); + } + + public class GoodActivityGeneric + { + private readonly T result; + + public GoodActivityGeneric(T result) => this.result = result; + + [Activity] + public T GoodAsyncAsync() => result; + } + public class BadActivityClassNoActivities { public int ActivityWithoutAttribute(int param) => param + 5;