当前位置:  开发笔记 > 编程语言 > 正文

如何在C#中使用私有构造函数实例化对象?

如何解决《如何在C#中使用私有构造函数实例化对象?》经验,为你挑选了2个好方法。

我绝对记得在某个地方看到一个使用反射或其他东西这样做的例子.这与SqlParameterCollection用户无法创造的事情有关(如果我没有记错的话).不幸的是再也找不到了.

有人可以在这里分享这个技巧吗?并不是说我认为它是一种有效的开发方法,我只是对这样做的可能性非常感兴趣.



1> Sean..:

您可以使用Activator.CreateInstance的重载之一来执行此操作:Activator.CreateInstance(Type type, bool nonPublic)

使用truenonPublic参数.因为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()
        {
        }
    }


如果你调用无参数构造函数,那就没问题.如果你想用params调用私有构造函数,试试这个:`Foo f =(Foo)Activator.CreateInstance(typeof(Foo),BindingFlags.Instance | BindingFlags.NonPublic,null,new object [] {"Param1"}, NULL,NULL);`

2> LukeH..:
// 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);
}

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有