我遇到了一个问题,我不确定我是否可以绕圈。我的库和另一个库都提供了特定类型数据的API,我现在编写了一个互操作库,它可以位于两个库之间,并在它们之间自由转换数据,效果很好。
但我现在尝试编写一个小型演示应用程序,通过我的API访问数据,使用第三个库依赖于其他API,这就是我遇到问题的地方。第三个库引用了另一个API的合并版本,一些相关的DLL引导是另一个API的旧版本,而我的API引用了其独立形式的其他API的最新版本。所以首先我必须使用外部别名甚至用3个库一起编写代码,否则类型会发生冲突而且不会编译。
所以现在当我尝试编写一个从我的API获取数据的应用程序时,通过互操作层运行它以便将其转换为另一个API,然后在这些数据上使用第三个库,因为.Net不会在它们认为不同的类型之间进行转换。有没有办法强迫.Net这样做或者我运气不好?
据我所知,第三个图书馆的作者计划将他的图书馆移动到将来基于其他API的最新版本(1.0.6.4),所以我可能只能等到那时呢?
using System;
using System.Collections.Generic;
using System.Linq;
using VDS.RDF;
using VDS.RDF.Interop;
using VDS.RDF.Parsing;
using VDS.RDF.Storage;
using SemWeb;
using LinqToRdf;
namespace RdfMusic
{
public class Program
{
public static void Main(string[] args)
{
try
{
//Get the Talis Connection
TalisPlatformConnector talis = new TalisPlatformConnector("store", "user", "password");
NativeStoreSource source = new NativeStoreSource(talis);
//Load the Data
Graph g = new Graph();
FileLoader.Load(g, "data.ttl");
//Ensure the data is in Talis
talis.SaveGraph(g);
//Now do a LinqToRdf query
//BUG: This cast fails since it's trying to cast to StatementSource in
//the SemWeb library (version 1.0.5.0 as referenced by LinqToRdf) from
//a StatementSource in the SemWeb library (version 1.0.6.4 as referenced by dotNetRDF)
StatementSource stmtSource = (StatementSource)source;
LinqToRdf.TripleStore ts = new LinqToRdf.TripleStore(new Store(stmtSource));
ts.QueryType = QueryType.LocalN3StoreInMemory;
IEnumerable<Track> tracks = from t in new MusicDataContext(ts).ForType<Track>()
where t.Year == "2006"
select t;
foreach (Track t in tracks)
{
Console.Write(t.Title + " by " + t.ArtistName);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
Exception innerEx = ex.InnerException;
while (innerEx != null)
{
Console.WriteLine();
Console.WriteLine(innerEx.Message);
Console.WriteLine(innerEx.StackTrace);
innerEx = innerEx.InnerException;
}
}
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
}
}
}
答案 0 :(得分:1)
是的,你运气不好。从CLR的角度来看,类型名称是程序集名称+可选模块名称+类型名称(这包括名称空间和外部类),系统是名义上的,而不是结构 - 不同的名称表示不同的类型。您可以做的最好是手动转换,只要您可以给予成员的可访问性(或者只是使用反射解决它)。
答案 1 :(得分:0)
在这种情况下,您可以使用Automapper来简化类型之间的映射。