获取一个类型作为从函数返回的接口

本文关键字:函数 返回 接口 类型 一个 获取 | 更新日期: 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[]),然后让它选择要调用的构造函数。