【发布时间】: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