将类型作为接口从函数

时间:2016-01-06 13:44:12

标签: c# reflection interface

我有一个返回接口的函数。

我想避免一堆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'。存在显式转换(是你   错过了   cast?)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;
}

所以现在,当我需要添加新的实现时,我只需要确保它们实现了接口,我会很高兴;)

1 个答案:

答案 0 :(得分:4)

我怀疑你只需要创建一个类型的实例并将其转换为你确信它实现的接口:

return (ILevel2) Activator.CreateInstance(myType);

那将使用无参数构造函数 - 但是 - 如果你需要调用另一个构造函数,你可以调用myType.GetConstructors(),或者只需调用Activator.CreateInstance(Type, Object[])然后选择要调用的构造函数。