gpt4 book ai didi

c# - 比较从不同程序集加载的对象

转载 作者:行者123 更新时间:2023-11-30 17:57:04 25 4
gpt4 key购买 nike

我有一些对象类,它们在设计上应该源自远程程序集。我希望能够比较这些类的实例是否相等,即使这些实例是从不同的程序集加载的。在现实生活中,这些将从网络位置或网络加载,我想与本地缓存进行比较。我从使用序列化和自定义序列化 Binder 的解决方案中获得了一些不错的结果。

我用来进行比较的示例客户端代码是:

    Assembly a = Assembly.LoadFile(@"c:\work\abc1\abc.dll");
Type t1 = a.GetType("Abc.Def");
Assembly b = Assembly.LoadFile(@"c:\work\abc2\abc.dll");
Type t2 = b.GetType("Abc.Def");
Object o1 = t1.GetConstructors()[0].Invoke(null);
Object o2 = t2.GetConstructors()[0].Invoke(null);
Console.WriteLine(o1.Equals(o2));

我在程序集中使用的模式是:

namespace Abc
{
internal sealed class DefBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
Type ttd = null;
try
{
ttd = this.GetType().Assembly.GetType(typeName);
}
catch (Exception any)
{
Debug.WriteLine(any.Message);
}
return ttd;
}
}


[Serializable]
public class Def
{
public Def()
{
Data = "This is the data";
}
public String Data { set; get; }
public override bool Equals(object obj)
{
if (obj.GetType().FullName.Equals(this.GetType().FullName))
{
try
{
BinaryFormatter bf = new BinaryFormatter();
System.IO.MemoryStream ms = new System.IO.MemoryStream();
bf.Serialize(ms, obj);
ms.Seek(0, System.IO.SeekOrigin.Begin);
bf.Binder = new Abc.DefBinder();
Abc.Def that = (Abc.Def)bf.Deserialize(ms);
if (this.Data.Equals(that.Data))
{
return true;
}
}
catch (Exception any) {
Debug.WriteLine(any.Message);
}
}
return false;
}
}
}

我的问题是:这似乎可行,但感觉很麻烦,那么是否有更直接的方法来比较可能从不同程序集加载的对象?

最佳答案

这有点棘手,但却是完成工作的一种快速简便的方法。您可以做的另一件事是使用大量反射为两个给定类型编写相等方法。像这样的东西:

public bool Equals(Type t1, Type t2)
{
var t1Constructors = t1.GetConstructors();
var t2Constructors = t2.GetConstructors();
//compare constructors
var t1Methods = t1.GetMethods();
var t2Methods = t2.GetMethods();
//compare methods
//etc.
}

等等,使用 BindingFlags 获取属性/方法/等。您关心并检查每个人是否平等。当然不是很容易,但它会给您很大的灵 active 来确定“平等”在您的特定用例中的真正含义。

关于c# - 比较从不同程序集加载的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13501458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com