2016-01-16 2 views
0

Допустим, у меня есть интерфейс, который называется IMyInterface и класс под названием MyClass, который реализует IMyInterfaceКак создать экземпляр объекта типа, переданного параметром, который должен реализовать определенный интерфейс?

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

Как бы я мог достичь этого? Если это невозможно, какое решение будет иметь такой же эффект?

+0

Я не совсем уверен, что вы здесь просите. Вы спрашиваете, как построить объект объекта «Type», переданный в, учитывая, что он относится к классу, который реализует определенный интерфейс? Или вы спрашиваете, как проверить, что переданный объект 'Type' указывает класс, реализующий этот интерфейс? Просьба уточнить. –

+0

Я хотел бы знать, как иметь метод, который задает тип, создает тип, но только если тип реализует определенный интерфейс. Поэтому я должен ответить на оба вопроса. Извините, если бы я разделил их на две должности. –

+0

Затем [@Vadim] (http://stackoverflow.com/users/5649561/vadim-martynov) уже отправил ваш ответ. –

ответ

1

Есть две части ответа. Во-первых, вы должны подтвердить тип, Type.IsAssignableFrom:

var implementInterface = (typeof(IMyInterface)).IsAssignableFrom(type); 
if(!implementInterface) 
    // return null, throw an exception or handle this scenario in your own way 

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

// create an object of the type 
var obj = (IMyInterface)Activator.CreateInstance(type); 

И вы получите экземпляр MyClass в OBJ.

Другой способ заключается в использовании отражение:

// get public constructors 
var ctors = type.GetConstructors(BindingFlags.Public); 

// invoke the first public constructor with no parameters. 
var obj = ctors[0].Invoke(new object[] { }); 

И от одного из ConstructorInfo вернулся, вы можете «Invoke()» он с аргументами и получить обратно экземпляр класса, как если бы вы использовали «новый» оператор.

+0

Это именно то, что мне нужно. Я тестировал и работал отлично. Спасибо! –

+1

Хорошо, в первый раз это сработало, но потом это больше не сработало, я, должно быть, не тестировался надлежащим образом, потому что я решил, что должен использовать «typeof (IMyInterface) .IsAssignableFrom (type);» вместо "type.IsAssignableFrom (typeof (IMyInterface));". Условия для этого перечислены здесь: https://msdn.microsoft.com/en-us/library/system.type.isassignablefrom(v=vs.110).aspx?f=255&MSPPError=-2147217396&cs-save -lang = 1 & cs-lang = csharp # code-snippet-1 Один из них говорит: «Текущий экземпляр - это интерфейс, который реализует c». Так что я предполагаю, что интерфейс должен быть тем, кто вызывает метод. –