如何检查一个types是否提供无参数的构造函数?
我想检查一个在运行时已知的types是否提供了一个无参数的构造函数。 Type
类没有产生任何有希望的东西,所以我假设我必须使用reflection?
Type
类是reflection。 你可以做:
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))