从同一程序集的不同版本中键入相同类型的转换

时间:2010-02-15 15:56:39

标签: c# .net casting types

我遇到了一个问题,我不确定我是否可以绕圈。我的库和另一个库都提供了特定类型数据的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();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

是的,你运气不好。从CLR的角度来看,类型名称是程序集名称+可选模块名称+类型名称(这包括名称空间和外部类),系统是名义上的,而不是结构 - 不同的名称表示不同的类型。您可以做的最好是手动转换,只要您可以给予成员的可访问性(或者只是使用反射解决它)。

答案 1 :(得分:0)

在这种情况下,您可以使用Automapper来简化类型之间的映射。