public static InvokeConstructor ( |
||
t | ||
args | object | |
Результат | object |
public static object InvokeConstructor(Type t, object[] args)
{
// TODO: Replace with GetContructors/GetMatchingMethodAux
IEnumerable<ConstructorInfo> einfos = t.GetConstructors().Where(ci => ci.GetParameters().Length == args.Length);
List<ConstructorInfo> infos = new List<ConstructorInfo>(einfos);
if (infos.Count == 0)
throw new ArgumentException("NO matching constructor found for " + t.Name);
else if (infos.Count == 1)
{
ConstructorInfo info = infos[0];
return info.Invoke(BoxArgs(info.GetParameters(), args));
}
else
{
ConstructorInfo info = null;
// More than one with correct arity. Find best match.
ConstructorInfo found = null;
foreach (ConstructorInfo ci in infos)
{
ParameterInfo[] pinfos = ci.GetParameters();
if (IsCongruent(pinfos, args))
{
if (found == null || Subsumes(pinfos, found.GetParameters()))
found = ci;
}
}
info = found;
if (info == null)
throw new InvalidOperationException(string.Format("Cannot find c-tor for type: {0} with the correct argument type", Util.NameForType(t)));
return info.Invoke(BoxArgs(info.GetParameters(), args));
}
}
protected override object Read(PushbackTextReader r, char eq) { if (!RT.booleanCast(RT.READEVAL.deref())) { throw new Exception("EvalReader not allowed when *read-eval* is false."); } Object o = read(r, true, null, true); if (o is Symbol) { return(RT.classForName(o.ToString())); } else if (o is IPersistentList) { Symbol fs = (Symbol)RT.first(o); if (fs.Equals(THE_VAR)) { Symbol vs = (Symbol)RT.second(o); return(RT.var(vs.Namespace, vs.Name)); //Compiler.resolve((Symbol) RT.second(o),true); } if (fs.Name.EndsWith(".")) { Object[] args = RT.toArray(RT.next(o)); return(Reflector.InvokeConstructor(RT.classForName(fs.Name.Substring(0, fs.Name.Length - 1)), args)); } if (Compiler.NamesStaticMember(fs)) { Object[] args = RT.toArray(RT.next(o)); return(Reflector.InvokeStaticMethod(fs.Namespace, fs.Name, args)); } Object v = Compiler.maybeResolveIn(Compiler.CurrentNamespace, fs); if (v is Var) { return(((IFn)v).applyTo(RT.next(o))); } throw new Exception("Can't resolve " + fs); } else { throw new ArgumentException("Unsupported #= form"); } }