获取一个类型作为从函数返回的接口
本文关键字:函数 返回 接口 类型 一个 获取 | 更新日期: 2023-09-27 18:29:14
我有一个返回接口的函数。
我想避免一堆IF ELSE,并通过反射获得类型。因此,我将名称空间、typename和assemblyname作为字符串传递,并构造类型OK。然而,我一直纠结于如何将其作为接口返回。
我的接口名为ILevel2。我返回的类型都实现了它,所以我希望下面的内容能起作用,但还没有乐趣。。。
有人能给我指个正确的方向吗。。。。。
string instanceReq = String.Format("{0}.{1}, {2}", nameSpace, typName, assseblyName);
var myType = Type.GetType(instanceReq);
ILevel2 myInterface = myType.GetInterface("ILevel2");
return myInterface;
我在设置myInterface=…的行中遇到编译器错误。。。。。
错误114无法将类型"System.type"隐式转换为"Level2Obligations.ILevel2"。存在显式转换(您是缺少铸造?)D: ''TFS''StockMaster_ECodes''StockMaster_ECode_Admin_MVC5''WebAPI''ECode_Web_Api''Models''ECodeLevel2Request.cs 103 35 ECode_Web _Api
添加更多细节。。。。。。
现在一团糟,但正如你所看到的,我正在努力变得更通用,而不是IF(namesapaceandType=="bghjbj")
private ILevel2 GetDLLInstance(string namespaceAndType)
{
var assseblyName = "Level2_Mock_Api";
var nameSpace = "Level2_Mock_Api";
var typName = "MockAPI";
string instanceReq = String.Format("{0}.{1}, {2}", nameSpace, typName, assseblyName);
var myType = Type.GetType(instanceReq);
var myInterface = (ILevel2)myType.GetInterface("ILevel2");
return myInterface;
if (namespaceAndType.ToUpper() == "LEVEL2_MOCK_API.MOCKAPI")
{
return new Level2_Mock_Api.MockAPI();
}
else......
如果将来有人有这个问题,这里是我与之合作的函数。。。。。。。。。。。
private ILevel2 GetDLLInstance(string AssemblyNamespaceAndType)
{
//As the name suggests this should be the Assembly Namespace and Type seperated by fullstops and is case sensitve
//eg Level2_Mock_Api.Level2_Mock_Api.MockAPI
string[] apiDetails = AssemblyNamespaceAndType.Split('.');
var assseblyName = apiDetails[0];
var nameSpace = apiDetails[1];
var typeName = apiDetails[2];
string typeReq = String.Format("{0}.{1}, {2}", nameSpace, typeName, assseblyName);
var myType = Type.GetType(typeReq);
if (myType != null)
return (ILevel2)Activator.CreateInstance(myType);
return null;
}
所以现在,当我需要添加新的实现时,我只需要确保它们实现了接口,我就可以开始了;)
我怀疑您只需要创建一个类型的实例,并将其转换为您确信它实现的接口:
return (ILevel2) Activator.CreateInstance(myType);
然而,这将使用无参数构造函数——如果需要调用不同的构造函数,可以调用myType.GetConstructors()
,或者只调用Activator.CreateInstance(Type, Object[])
,然后让它选择要调用的构造函数。