© 2026 Hedgehog Software, LLC

TwitterGitHubDiscord
More
CommunitiesDocsAboutTermsPrivacy
Search
Star
Setup for Free
C#C
C#•13mo ago•
22 replies
Kaihyo

Creating a delegate that accept a ref from a struct method

Hi !

I am working within Unity but this is a C# question. I am trying to implement attributes that alter the appearance of fields in the inspector depending on a condition passed as string. The condition may be a field, a property or a method, which MemberInfo is fetched through reflection. My previous was working in most scenarios except for the case where the attribute is applied on struct's member (which makes sense since struct are not supposed to be mutable).

Since my end users may do some shenanigans with struct, I searched a solution and found this post : https://stackoverflow.com/a/1212396

So I tried to adapt it to my needs but I get this error :
ArgumentException: method arguments are incompatible
System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, System.Boolean throwOnBindFailure, System.Boolean allowClosed) (at <321eb2db7c6d43ea8fc39b54eaca3452>:0)
ArgumentException: method arguments are incompatible
System.Delegate.CreateDelegate (System.Type type, System.Object firstArgument, System.Reflection.MethodInfo method, System.Boolean throwOnBindFailure, System.Boolean allowClosed) (at <321eb2db7c6d43ea8fc39b54eaca3452>:0)

Since the post is pretty old, my question is: is the answer from the post still valid ?
Here is my implementation :

private delegate TResult RefFunc<TArg, TResult>(ref TArg arg);

private static bool TryGetDelegate<T>(string memberName, out RefFunc<T, bool> @delegate)
{
    System.Type typeOfT = typeof(T);
    MethodInfo method = typeOfT.GetMethod(memberName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new System.Type[] { }, null);
    if (method == null)
    {
        @delegate = null;
        return false;
    }

    @delegate = (RefFunc<T, bool>)System.Delegate.CreateDelegate(typeof(RefFunc<T, bool>), null, method); // The error occures here
    return true;
}
private delegate TResult RefFunc<TArg, TResult>(ref TArg arg);

private static bool TryGetDelegate<T>(string memberName, out RefFunc<T, bool> @delegate)
{
    System.Type typeOfT = typeof(T);
    MethodInfo method = typeOfT.GetMethod(memberName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new System.Type[] { }, null);
    if (method == null)
    {
        @delegate = null;
        return false;
    }

    @delegate = (RefFunc<T, bool>)System.Delegate.CreateDelegate(typeof(RefFunc<T, bool>), null, method); // The error occures here
    return true;
}

And the current attribute setup:

public class TestClass : UnityEngine.MonoBehaviour
{
  [ShowIf(nameof(ShowIf))]
  public UnityEngine.Object TestUnityObject;
  
  private bool ShowIf()
  {
    return this.ShowGroup;
  }
}
public class TestClass : UnityEngine.MonoBehaviour
{
  [ShowIf(nameof(ShowIf))]
  public UnityEngine.Object TestUnityObject;
  
  private bool ShowIf()
  {
    return this.ShowGroup;
  }
}
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

Generically creating a delegate from a MethodInfo with parameter upcasting
C#CC# / help
17mo ago
Create a `Delegate` from a `MethodInfo` [Answered]
C#CC# / help
4y ago
difference between `struct` and `ref struct`
C#CC# / help
12mo ago
Why is the generic delegate does not accept my method?
C#CC# / help
4y ago