// create dynamic struct Formatter<T> public static object Create <TTypeResolver, T>() where TTypeResolver : ITypeResolver, new() { var resolverType = typeof(TTypeResolver); var t = typeof(T); var ti = t.GetTypeInfo(); if (!ti.IsValueType) { throw new InvalidOperationException("Type must be ValueType. " + t.Name); } if (ti.IsNullable()) { var elementType = ti.GetGenericArguments()[0]; var formatter = typeof(Formatter <,>).MakeGenericType(resolverType, elementType).GetTypeInfo().GetProperty("Default").GetGetMethod().Invoke(null, null); return(Activator.CreateInstance(typeof(NullableStructFormatter <,>).MakeGenericType(resolverType, elementType), new[] { formatter })); } else { var elementType = t; var members = DynamicObjectDescriptor.GetMembers(resolverType, elementType, false); var length = ValidateAndCalculateLength(resolverType, elementType, members); var generateTypeInfo = BuildFormatter(ZeroFormatter.Segments.DynamicAssemblyHolder.Module, resolverType, elementType, length, members); var formatter = Activator.CreateInstance(generateTypeInfo.AsType()); return(formatter); } }
public static object Create <T>() { var t = typeof(T); var ti = t.GetTypeInfo(); if (ti.IsValueType) { throw new InvalidOperationException("Type must be Class. " + t.Name); } var members = DynamicObjectDescriptor.GetMembers(t, true); var generateTypeInfo = BuildFormatter(ZeroFormatter.Segments.DynamicAssemblyHolder.Module, t, members); var formatter = Activator.CreateInstance(generateTypeInfo.AsType()); return(formatter); }