首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能强制转换到看似相同的类

不能强制转换到看似相同的类
EN

Stack Overflow用户
提问于 2021-06-08 21:15:00
回答 1查看 43关注 0票数 1

我正在用.NET-5编写C#,并尝试基于一些XML实例化一个类。这似乎工作得很好,因为我得到了所需对象的一个实例:

代码语言:javascript
复制
var refxmlFileInfo = new FileInfo(settings.COBDateSetting);
// Casting fails. The Object is of the expected type
CalcConfiguration.CobDateSettings = (COBDate_Settings)factoryHelper.GetInstance(refxmlFileInfo, xmlFileInfo.FullName);

但是,转换失败,并出现一个奇怪的错误,表明实例和目标的类型相同:

代码语言:javascript
复制
[A]DataModel.BusinessDays.COBDate_Settings cannot be cast to
[B]DataModel.BusinessDays.COBDate_Settings.

Type A originates from 'DataModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' at location
'<REMOVED>\bin\Debug\net5.0\DataModel.dll'.

Type B originates from 'DataModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'Default' at location
'<REMOVED>\bin\Debug\net5.0\DataModel.dll'.

我已经检查了项目之间的引用,但没有发现任何异常。

代码语言:javascript
复制
public object GetInstance(FileInfo xmlFileInfo,string usedWhere)
{
   ISettings setting = GetSettings(xmlFileInfo, usedWhere);
   var classToResolve = ((IDefiningType)setting).GetDefiningType();
   var classInstance = (IInitializeXML)Unity.Resolve(classToResolve);
   classInstance.InitializeXML(this, xmlFileInfo);
   return classInstance;
}

public ISettings GetSettings(FileInfo xmlFileInfo,string usedWhere)
{
   if (!xmlFileInfo.Exists)
   {
     var msg = string.Format("Path: <{0}> not found in referenced file: {1}", xmlFileInfo.FullName,usedWhere);
     throw new Exception(msg);
    }

// Uses some regex to find out which class is XML-Serialized. The string is // then checked against all types in assembly. Types are extracted using
// *.dll and the loading the assembly
var typeToResolve = GetSettingsType(xmlFileInfo);
// We now have a instance of the definingType class
ISettings setting = (ISettings)Convert.ChangeType(SettingsSerializer.Deserialize(typeToResolve, xmlFileInfo), typeToResolve);
            return setting;
 }

有没有人知道问题出在哪里?

EN

回答 1

Stack Overflow用户

发布于 2021-06-09 15:04:24

我找到了解决方案。原因是我使用LoadFile遍历了DLL:

代码语言:javascript
复制
var baseDir = AppContext.BaseDirectory;
var dir = new DirectoryInfo(baseDir);
foreach (var dllfile in dir.GetFiles("*.dll"))

似乎C#没有意识到这些类是相同的,并且它们来自同一个动态链接库。我使用这篇文章中的一个解决方案解决了这个问题:

Getting Information about a assembly which is present in Solution

代码语言:javascript
复制
public IEnumerable<Assembly> GetAssemblies()
        {
            var list = new List<string>();
            var stack = new Stack<Assembly>();

            stack.Push(Assembly.GetEntryAssembly());

            do
            {
                var asm = stack.Pop();

                yield return asm;

                foreach (var reference in asm.GetReferencedAssemblies())
                    if (!list.Contains(reference.FullName))
                    {
                        stack.Push(Assembly.Load(reference));
                        list.Add(reference.FullName);
                    }

            }
            while (stack.Count > 0);

        }

但是,在这种情况下,我必须引用所有程序集,并在引用的程序集中调用某些内容。上面的代码似乎只有在dlls已经加载的情况下才能工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67887729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档