如何检查一个types是否提供无参数的构造函数?

我想检查一个在运行时已知的types是否提供了一个无参数的构造函数。 Type类没有产生任何有希望的东西,所以我假设我必须使用reflection?

Typereflection。 你可以做:

 Type theType = myobject.GetType(); // if you have an instance // or Type theType = typeof(MyObject); // if you know the type var constructor = theType.GetConstructor(Type.EmptyTypes); 

如果无参数的构造函数不存在,它将返回null。


如果您还想查找私有构造函数,请使用稍长的:

 var constructor = theType.GetConstructor( BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); 

值types有一个警告, 不允许有一个默认的构造函数 。 您可以使用Type.IsValueType属性检查是否有值types,并使用Activator.CreateInstance(Type)创build实例;

是的,你必须使用reflection。 但是当你使用GetType()时你已经这样做了

就像是:

 var t = x.GetType(); var c = t.GetConstructor(new Type[0]); if (c != null) ... 
 type.GetConstructor(Type.EmptyTypes) != null 

会失败的struct 。 更好地扩展它:

 public static bool HasDefaultConstructor(this Type t) { return t.IsValueType || t.GetConstructor(Type.EmptyTypes) != null; } 

成功以来,即使enum有默认的无参数构造函数。 由于没有进行reflection调用,所以也稍微加快了值types。

这应该工作:

  myClass.GetType().GetConstructors() .All(c=>c.GetParameters().Length == 0) 

根据您的情况,您也可以使用通用types限制:

 public void DoSomethingWith<T>(T myObject) where T:new() {...} 

上面的方法声明将参数types限制为可以用无参数构造函数实例化的任何对象。 这样做的好处是,编译器会捕获任何尝试使用没有无参数构造函数的类的方法,所以只要在编译时知道SOMEWHEREtypes,就可以工作,并提醒您问题较早。

当然,如果只在运行时才知道types(即,你正在使用Activator.CreateInstance()来实例化一个基于string或构造types的对象),那么这对你没有任何帮助。 我通常使用reflection作为绝对的最后select,因为一旦你去了充满活力的土地,你几乎必须呆在dynamic的土地上; dynamic实例化一些东西然后开始静态地处理它通常很困难或者更加混乱。

是的,你必须使用反思。

 object myObject = new MyType(); Type type = myObject.GetType(); ConstructorInfo conInfo = type.GetConstructor(new Type[0]); 

我需要计数构造函数只有可选参数相同的真正的无参数的构造函数。 去做这个:

 myClass.GetType().GetConstructors() .All(c => c.GetParameters().Length == 0 || c.GetParameters().All(p => p.IsOptional))