, , , , . . , . . .
: FooStruct FooClass, :
, object ( val). , , - object s;
val object T FooStruct/FooClass.
, ?. , object ( val), , <T> where T : struct <T> where T : class ( T). foreach. , - , .. T ; , , : mdash, , T.
:
Type type = val.GetType();
string fooName = type.IsValueType ? "FooStruct" : "FooClass";
MethodInfo fooOpen = typeof(FooMethodsClass).GetMethod(fooName, BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
MethodInfo foo = fooOpen.MakeGenericMethod(new Type[] { type });
foo.Invoke(null, new object[] { val });