© 2026 Hedgehog Software, LLC

TwitterGitHubDiscord
More
CommunitiesDocsAboutTermsPrivacy
Search
Star
Setup for Free
C#C
C#•17mo ago•
1 reply
Rettoph

Generically creating a delegate from a MethodInfo with parameter upcasting

I am trying to create a delegate of type
TDelegate
TDelegate
that allows me to invoke a MethodInfo instance with some upcasted parameters. A simple example of what i want is as follows:
using System.Reflection;

MethodInfo someFunctionMethodInfo = typeof(MyTestClass).GetMethod(nameof(MyTestClass.SomeFunction), BindingFlags.Static | BindingFlags.Public)!;

// Note, SomeFunction is an Action<object> and i want an Action<int>
// System.ArgumentException: 'Cannot bind to the target method because its signature is not compatible with that of the delegate type.'
var customDelegateUpcasting = DelegateHelper.CreateDelegateWithCasting<Action<int>>(someFunctionMethodInfo);
customDelegateUpcasting(10);

// Desired output:
// SomeFunction invoked with parameter: 10, Type: System.Int32

Console.ReadLine();

class DelegateHelper
{
    public static TDelegate CreateDelegateWithCasting<TDelegate>(MethodInfo method)
        where TDelegate : Delegate
    {
        // Currently throws:
        // System.ArgumentException: 'Cannot bind to the target method because its signature is not compatible with that of the delegate type.'
        return method.CreateDelegate<TDelegate>();
    }
}

class MyTestClass
{
    public static void SomeFunction(object param)
    {
        Console.WriteLine($"{nameof(SomeFunction)} invoked with parameter: {param}, Type: {param.GetType()}");
    }
}
using System.Reflection;

MethodInfo someFunctionMethodInfo = typeof(MyTestClass).GetMethod(nameof(MyTestClass.SomeFunction), BindingFlags.Static | BindingFlags.Public)!;

// Note, SomeFunction is an Action<object> and i want an Action<int>
// System.ArgumentException: 'Cannot bind to the target method because its signature is not compatible with that of the delegate type.'
var customDelegateUpcasting = DelegateHelper.CreateDelegateWithCasting<Action<int>>(someFunctionMethodInfo);
customDelegateUpcasting(10);

// Desired output:
// SomeFunction invoked with parameter: 10, Type: System.Int32

Console.ReadLine();

class DelegateHelper
{
    public static TDelegate CreateDelegateWithCasting<TDelegate>(MethodInfo method)
        where TDelegate : Delegate
    {
        // Currently throws:
        // System.ArgumentException: 'Cannot bind to the target method because its signature is not compatible with that of the delegate type.'
        return method.CreateDelegate<TDelegate>();
    }
}

class MyTestClass
{
    public static void SomeFunction(object param)
    {
        Console.WriteLine($"{nameof(SomeFunction)} invoked with parameter: {param}, Type: {param.GetType()}");
    }
}


The tldr, i want to take method
void SomeFunction(object param)
void SomeFunction(object param)
and create a delegate
Action<int>
Action<int>
... generically

In this example im just calling
MethodInfo::CreateDelegate<TDelegate>()
MethodInfo::CreateDelegate<TDelegate>()
- which fails. This is fine, i expect and understand why this happens. I'm just looking for ideas to achieve what im looking for.

traditionally, i might just wrap the MethodInfo invocation within a lambda and call it a day... but since TDelegate is a generic type i dont actually know the number of parameters until the
CreateDelegateWithCasting
CreateDelegateWithCasting
helper method is called - which is where my problem lies.
C# banner
C#Join
We are a programming server aimed at coders discussing everything related to C# (CSharp) and .NET.
61,871Members
Resources
Was this page helpful?

Similar Threads

Recent Announcements

Similar Threads

Create a `Delegate` from a `MethodInfo` [Answered]
C#CC# / help
4y ago
✅ Creating a number generically?
C#CC# / help
4y ago
❔ Building a delegate with a Type and a MethodInfo keeps throwing ArgumentException
C#CC# / help
3y ago
Creating a delegate that accept a ref from a struct method
C#CC# / help
13mo ago