可以说,我有一个名为IMyInterface的接口,以及一个名为MyClass的类,它实现IMyInterface的如何实例化通过参数传递的类型的对象,需要实现某个接口?
在另一类我有一个类型作为参数的方法,该类型必须实现IMyInterface的是有效的。例如MyClass将是一个有效的参数。然后在该方法中,我将实例化一个由参数传递的类型的对象。
我该怎么做到这一点?如果不可能,哪种解决方案会产生类似的效果?
可以说,我有一个名为IMyInterface的接口,以及一个名为MyClass的类,它实现IMyInterface的如何实例化通过参数传递的类型的对象,需要实现某个接口?
在另一类我有一个类型作为参数的方法,该类型必须实现IMyInterface的是有效的。例如MyClass将是一个有效的参数。然后在该方法中,我将实例化一个由参数传递的类型的对象。
我该怎么做到这一点?如果不可能,哪种解决方案会产生类似的效果?
答案有两部分。首先,你应该通过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回来一个,你可以在“调用()”,它与参数并取回类的实例,如果你已经使用了“新”运营商。
这正是我所需要的。我测试过,效果很好。谢谢! –
好的,第一次工作,但后来它不再工作,我一定没有适当的测试,因为我想我应该使用“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实现的接口”。 所以我想接口必须是调用方法的人。 –
我不完全确定你在问什么。你在问如何构造一个传入的'Type'对象的对象,因为它引用了一个实现了某个接口的类?还是你问如何验证传入的'Type'对象详细说明了实现该接口的类?请澄清。 –
我想知道如何让一个给定类型的方法构造类型,但只有当类型实现了某个接口。所以这两个问题我不得不说。对不起,如果我应该分成两个职位。 –
然后[@Vadim](http://stackoverflow.com/users/5649561/vadim-martynov)已经发布了您的答案。 –