public static RubyModule/*!*/ Of(RubyModule/*!*/ self, [NotNullItems]params object/*!*/[]/*!*/ typeArgs) {
if (self.TypeTracker == null) {
throw RubyExceptions.CreateArgumentError("'{0}' is not a type", self.Name);
}
Type type = self.TypeTracker.Type;
int provided = typeArgs.Length;
if (provided == 1 && type == typeof(Array)) {
Type elementType = Protocols.ToType(self.Context, typeArgs[0]);
Type arrayType;
try {
arrayType = elementType.MakeArrayType();
} catch (Exception) {
throw RubyExceptions.CreateTypeError(
"Cannot create array type for `{0}'", self.Context.GetTypeName(elementType, true)
);
}
return self.Context.GetModule(arrayType);
}
if (!type.IsGenericTypeDefinition) {
if (provided > 0) {
throw RubyExceptions.CreateArgumentError("`{0}' is not a generic type definition", self.Name);
}
return self;
}
int required = type.GetGenericArguments().Length;
if (required != provided) {
throw RubyExceptions.CreateArgumentError("Type `{0}' requires {1} generic type arguments, {2} provided", self.Name, required, provided);
}
Type concreteType = type.MakeGenericType(Protocols.ToTypes(self.Context, typeArgs));
return self.Context.GetModule(concreteType);
}