【发布时间】:2015-01-09 10:05:51
【问题描述】:
我正在与C#、.NET 4.5 合作。
我有 2 个对象(实际上更多,但为了简单起见,我们坚持使用两个),它们是独立的实体,都来自 3rd 方库,但是它们确实很少有共同的属性。
我想做一个抽象机制来处理这些属性。如果这些对象是我的,我可以通过添加界面轻松完成
class Foo : IFooBar
{
public string A { get; set; }
public string B { get; set; }
}
class Bar : IFooBar
{
public string A { get; set; }
public string B { get; set; }
}
interface IFooBar
{
string A { get; set; }
string B { get; set; }
}
public static class Extensions
{
public static IFooBar ProcessedFoobars(IFooBar fooBar)
{
...(do things to A and B)
}
}
但是,由于它们来自第 3 方,我没有(不知道)将它们放在接口后面的方法。
我看到 ATM 的选项:
将
Foo和Bar转换为MyFoo和MyBar,它们是我的内部对象,将MyFoo和MyBar放在接口后面并以这种方式处理它们-
使用只接受属性作为输入的方法。
Tuple<string, string> DoThings(string A, string B) { ...(do things to A and B) }
这将涉及来自第 3 方对象的每种风格的大量映射。
-
此时我倾向于使用反射。
public T FooBarProcessor<T>(T fooBar) { var type = typeof (T); var propertyA = type.GetProperty("A"); var propertyB = type.GetProperty("B"); var a = propertyA.GetValue(fooBar, null); var b = propertyB.GetValue(fooBar, null); ... (do things to A and B) propertyA.SetValue(fooBar, a); propertyB.SetValue(fooBar, b); return fooBar; }
有没有办法在 3rd 方对象(或其他一些解决方法)后面“偷偷摸摸”接口,让我可以让多个对象看起来好像它们在接口后面,所以我可以同时处理它们方式。
是什么让我希望可以做到这一点 - PostSharp 确实允许在付费版本中执行“方面继承”(我自己没有尝试过,所以可能会有所不同)和如果他们以某种方式这样做 - 那么这可以做到。
【问题讨论】:
-
PostSharp 从头开始修改和重建程序集。您别无选择,只能将第 3 方对象包装在您自己的对象中,您可以在其中添加接口。
-
PostSharp '修补' IL - 你不想做任何事情......
-
如果不修改程序集,我认为这是不可能的。您可以选择创建自己的代理类(使用您的通用接口)调用第三方类。
-
@LIUFA 嗯...总是有
dynamic,这将允许您针对类型进行回避类型,但这会将所有问题(例如缺少属性或不同类型)转移到运行时并在您的应用程序中涉及 DLR,您可能希望也可能不希望在这种微不足道的情况下调用它。我个人要么包装类型(适配器答案),要么让方法直接获取属性。