2017-01-31 3 views
1

У меня есть заводский класс, который должен создать экземпляр неизвестного класса. Он делает это как так:Тип объекта с внутренним конструктором с отражением

public class Factory 
{ 
    public void SetFoo(Type f) 
    { 
     Activator.CreateInstance(f); 
    } 
} 

Проблема Я хотел бы, что конструктор быть внутренним, но маркировка это внутреннее дает мне MissingMethodException, но конструктор находится в той же сборке. если он установлен на puclic, он отлично работает.

Я попытался решения, предоставленные здесь How to create an object instance of class with internal constructor via reflection?

и здесь Instantiating a constructor with parameters in an internal class with reflection

, который транслирует делать, как, например:

Activator.CreateInstance(f,true) 

, но не успех ...

Я использую NETStandard.Library (1.6.1) с System.Reflection (4.3.0)

Update:

ответы, представленные во время этого обновления указал мне в правильном направлении:

var ctor = f.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic); 

var instance = (f)ctor[0].Invoke(null); 

Спасибо, ребята!

+0

'Activator.CreateInstance (f, true)' отлично работает для меня с внутренним конструктором. Можете ли вы предоставить [воспроизводимый пример] (http://stackoverflow.com/help/mcve) –

+0

Означает ли конструктор некоторые параметры? –

+0

Является ли класс 'Factory' определяемым в другой сборке, чем тип F? – Michael

ответ

0

Во-первых, вам нужно найти конструктор:

var ctor = typeof(MyType).GetTypeInfo().GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance).Single(x => /*filter by the parameter types*/); 
var instance = ctor.Invoke(parameters) as MyType; 

Пожалуйста, добавьте ссылку на пространство имен System.Reflection.

+0

для GetInfo(). GetConstructors ... Я получаю 'Тип info не содержит определения для GetConstructors() –

0

Вы можете получить конструктор через отражение и вызвать его.

var ctor = typeof(Test) 
    .GetConstructors(
     BindingFlags.NonPublic | 
     BindingFlags.Public | 
     BindingFlags.Instance 
    ) 
    .First(); 
var instance = ctor.Invoke(null) as Test; 
1

BindingFlags:

var ctor = typeof(MyType)..GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic).FirstOrDefault(c => !c.GetParameters().Any()); 

var instance = (MyType)ctor.Invoke(new object[0]); 

В BindingFlags получает непубличные конструкторами. Конкретный конструктор определяется с помощью определенных типов параметров (или, скорее, из-за отсутствия параметров). Invoke вызывает конструктор и возвращает новый экземпляр.

+0

.NET Core не имеет метода GetConstructor, который принимает два параметра , –

+0

здесь я получаю Нет перегрузки для 'GetConstructor' принимает 4 аргумента. –