【问题标题】:Getting a Type as an Interface to return from a function将类型作为接口从函数返回
【发布时间】:2016-01-06 13:44:11
【问题描述】:

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

我想避免一堆 IF ELSE 并通过反射获取类型。 所以我将命名空间、类型名和程序集名作为字符串传入并构造类型确定。 但是,我不知道如何将其作为接口返回。

我的界面是名称 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;
}

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

【问题讨论】:

  • 听起来你需要构造一个类型的 instance ......目前还不清楚你想要实现什么。如果您包含一个简短但完整的示例(而不是 sn-p),这将更容易为您提供帮助
  • Aaaaah - 我看到 Jon,我有这个类型,现在创建一个该类型的实例......我会看看我是怎么做的。
  • 希望我的回答能在这方面有所帮助:)

标签: c# reflection interface


【解决方案1】:

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

return (ILevel2) Activator.CreateInstance(myType);

但是,这将使用无参数构造函数 - 如果您需要调用不同的构造函数,您可以调用 myType.GetConstructors(),或者只调用 Activator.CreateInstance(Type, Object[]) 并让它选择要调用的构造函数。

【讨论】:

  • 谢谢。已经将 instanceReq 重命名为 typeReq ;) 再次感谢。很有用
猜你喜欢
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 2018-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多