C# 比较从不同程序集加载的对象
我有一些类的对象,它们在设计上应该来自远程程序集。我希望能够比较这些类的实例是否相等,即使这些实例是从不同的程序集加载的。在现实生活中,这些将从网络位置或web加载,我想与本地缓存进行比较。我从一个使用序列化和自定义序列化绑定的解决方案中得到了一些很好的结果 我用于进行比较的示例客户端代码是:C# 比较从不同程序集加载的对象,c#,.net,reflection,C#,.net,Reflection,我有一些类的对象,它们在设计上应该来自远程程序集。我希望能够比较这些类的实例是否相等,即使这些实例是从不同的程序集加载的。在现实生活中,这些将从网络位置或web加载,我想与本地缓存进行比较。我从一个使用序列化和自定义序列化绑定的解决方案中得到了一些很好的结果 我用于进行比较的示例客户端代码是: Assembly a = Assembly.LoadFile(@"c:\work\abc1\abc.dll"); Type t1 = a.GetType("Abc.Def"); A
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获取您关心的属性/方法/等,并检查每个属性/方法是否相等。当然不太容易,但它会给你很大的灵活性,让你可以确定“平等”在你的特定用例中真正意味着什么。有帮助吗?埃文,我想打趣一下,这不是一个可行的解决方案,因为我还需要访问私人成员。不管怎样,我还是继续测试了它,我完全惊讶于我不仅可以使用反射来发现私有成员,还可以从一个完全不同的类中调用它们。这怎么可能?我不知道!