Как инстанцировать объекта с частным конструктором в C#?

Используйте условие в части значения понимания "

newlist = ["pass" if k == 1 else "fail" for k in decision]

В качестве альтернативы, если у вас есть больше значений, создайте словарь:

res_dict = {
    0  : "Equal",
    1  : "Higher",
    -1 : "Lower",
}

newlist = [res_dict.get(x) for x in decision]
30
задан stop-cran 25 February 2019 в 11:50
поделиться

4 ответа

// 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<TheTypeYouWantToInstantiate>(paramTypes, paramValues);

// ...

public static T Construct<T>(Type[] paramTypes, object[] paramValues)
{
    Type t = typeof(T);

    ConstructorInfo ci = t.GetConstructor(
        BindingFlags.Instance | BindingFlags.NonPublic,
        null, paramTypes, null);

    return (T)ci.Invoke(paramValues);
}
42
ответ дан LukeH 27 November 2019 в 23:02
поделиться

Можно использовать одну из перегрузок Активатора. 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()
        {
        }
    }
62
ответ дан Mariano Desanze 27 November 2019 в 23:02
поделиться

Действительно ли это - вопрос, которым Вы были после? Активатор. CreateInstance с частным запечатанным классом

4
ответ дан Community 27 November 2019 в 23:02
поделиться

Если класс не является одним вашим, то он кажется, что API был сознательно записан для предотвращения этого, что означает, что возможно, что подход не то, что предназначили писатели API. Смотрите на документы и посмотрите, существует ли рекомендуемый подход к использованию этого класса.

Если Вы действительно управляете классом и хотите реализовать этот шаблон, то он обычно реализуется через статический метод для класса. Это - ключевое понятие, которое составляет Шаблон "одиночка", также.

Например:

public PrivateCtorClass
{
    private PrivateCtorClass()
    {
    }

    public static PrivateCtorClass Create()
    {
        return new PrivateCtorClass();
    }
}

public SomeOtherClass
{
    public void SomeMethod()
    {
        var privateCtorClass = PrivateCtorClass.Create();
    }
}

Материал SqlCommandParameter является хорошим примером. Они ожидают, что Вы создадите параметры путем вызова вещей как это:

var command = IDbConnnection.CreateCommand(...);
command.Parameters.Add(command.CreateParameter(...));

Моим примером не является большой код, потому что он не демонстрирует свойства параметра команды установки или повторное использование параметров/команд, но Вы получаете идею.

2
ответ дан Neil Barnwell 27 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: