public static void Assign<T>(T value) {}
public static void Main()
AssignmentTest(typeof(int), typeof(double));
static (bool, bool) AssignmentTest(Type t1, Type t2)
var xObj = Activator.CreateInstance(t1);
var yObj = Activator.CreateInstance(t2);
var assignGenMethod = typeof(Program).GetMethod(nameof(Assign));
var xAssignMethod = assignGenMethod.MakeGenericMethod(xObj.GetType());
var yAssignMethod = assignGenMethod.MakeGenericMethod(yObj.GetType());
InvokeSafe(xAssignMethod, yObj),
InvokeSafe(yAssignMethod, xObj)
static bool InvokeSafe(MethodInfo method, object value)
method.Invoke(null, new []{ value} );
Console.WriteLine("SUCCESS: CAN assign {0} to {1}", value.GetType().Name, method.GetParameters()[0].ParameterType.Name);
Console.WriteLine("FAILURE: CANNOT assign {0} to {1}", value.GetType().Name, method.GetParameters()[0].ParameterType.Name);