2016-01-16 33 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); 

你会在OBJ获得MyClass的实例。

另一种方法是使用反射:

// 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回来一个,你可以在“调用()”,它与参数并取回类的实例,如果你已经使用了“新”运营商。

+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实现的接口”。 所以我想接口必须是调用方法的人。 –

相关问题