diff --git a/Bonsai.Sgen/Bonsai.Sgen.csproj b/Bonsai.Sgen/Bonsai.Sgen.csproj index 3175958..1464524 100644 --- a/Bonsai.Sgen/Bonsai.Sgen.csproj +++ b/Bonsai.Sgen/Bonsai.Sgen.csproj @@ -4,7 +4,7 @@ Exe net6.0 enable - 0.1.0 + 0.2.0 enable diff --git a/Bonsai.Sgen/CSharpClassTemplate.cs b/Bonsai.Sgen/CSharpClassTemplate.cs index 3513607..ea8031f 100644 --- a/Bonsai.Sgen/CSharpClassTemplate.cs +++ b/Bonsai.Sgen/CSharpClassTemplate.cs @@ -153,7 +153,37 @@ public string Render() {{ {propertyAssignments} }})")))); + + var genericTypeParameter = new CodeTypeParameter("TSource"); + var genericSourceParameter = new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(IObservable<>)) + { + TypeArguments = { new CodeTypeReference(genericTypeParameter) } + }, "source"); + var genericProcessMethod = new CodeMemberMethod + { + Name = "Process", + Attributes = MemberAttributes.Public | MemberAttributes.Final, + TypeParameters = { genericTypeParameter }, + Parameters = { genericSourceParameter }, + ReturnType = new CodeTypeReference(typeof(IObservable<>)) + { + TypeArguments = { new CodeTypeReference(Model.ClassName) } + } + }; + genericProcessMethod.Statements.Add(new CodeMethodReturnStatement( + new CodeMethodInvokeExpression( + new CodeMethodReferenceExpression( + new CodeTypeReferenceExpression("System.Reactive.Linq.Observable"), + "Select"), + new CodeVariableReferenceExpression(genericSourceParameter.Name), + new CodeSnippetExpression( + @$"_ => new {Model.ClassName} + {{ +{propertyAssignments} + }}")))); + type.Members.Add(processMethod); + type.Members.Add(genericProcessMethod); type.CustomAttributes.Add(new CodeAttributeDeclaration( new CodeTypeReference("Bonsai.CombinatorAttribute"))); type.CustomAttributes.Add(new CodeAttributeDeclaration(