コード例 #1
0
        // 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);
            }
        }
コード例 #2
0
        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);
        }