我绝对记得在某个地方看到一个使用反射或其他东西这样做的例子.这与SqlParameterCollection
用户无法创造的事情有关(如果我没有记错的话).不幸的是再也找不到了.
有人可以在这里分享这个技巧吗?并不是说我认为它是一种有效的开发方法,我只是对这样做的可能性非常感兴趣.
您可以使用Activator.CreateInstance的重载之一来执行此操作:Activator.CreateInstance(Type type, bool nonPublic)
使用true
的nonPublic
参数.因为true
匹配公共或非公共默认构造函数; 并false
仅匹配公共默认构造函数.
例如:
class Program { public static void Main(string[] args) { Type type=typeof(Foo); Foo f=(Foo)Activator.CreateInstance(type,true); } } class Foo { private Foo() { } }
// the types of the constructor parameters, in order // use an empty Type[] array if the constructor takes no parameters Type[] paramTypes = new Type[] { typeof(string), typeof(int) }; // the values of the constructor parameters, in order // use an empty object[] array if the constructor takes no parameters object[] paramValues = new object[] { "test", 42 }; TheTypeYouWantToInstantiate instance = Construct(paramTypes, paramValues); // ... public static T Construct (Type[] paramTypes, object[] paramValues) { Type t = typeof(T); ConstructorInfo ci = t.GetConstructor( BindingFlags.Instance | BindingFlags.NonPublic, null, paramTypes, null); return (T)ci.Invoke(paramValues); }