English 中文(简体)
积极实施守则接口
原标题:Make object dynamically implement an interface in code

我想通过这一检验方法——任何人都想如何这样做?

public class Something
{
    public string Name {get; set}
}

public interface IWithId
{
    public Guid Id {get; set}
}

public class IdExtender 
{
    public static Object Extend(object toExtend)
    {
        ...?
    }
}

public class Tests 
{
    [Test]
    public void Should_extend_any_object()
    {
        var thing = new Something { Name = "Hello World!"};
        var extended = IdExtender.Extend(thing);
        Assert.IsTrue(extended is IWithId);
        Assert.IsTrue(extended.Id is Guid);
        Assert.IsTrue(extened.Name == "Hello World!");
    }
}

我猜想,像这样的东西可以用城堡动态代理、lin子、etc,但如何做?

最佳回答

利用卡斯尔(明显)

确实,你们必须创造新的回归目标,因为你在方案执行过程中,能够有现成的类型获得新的接口。

为此,你必须设立一个代理机构,然后把你先前的物体转至代理人。 该局没有。 在诉2.5中,你可以使用新类别代用目标,但只有在这些类型的所有不动产都处于虚拟状态时才会这样做。

任何方面。 您能够使新的类型获得<代码>。 IWithId接口,要么将代用品与实施该财产的现有物体混为一谈。 然后,向接口成员发出的电话将转交物体。

或者,你可以提供额外的接口,以实施,并有一名拦截者填补执行者的作用。

问题回答

我现在要谈谈这样的问题:

public class IdExtender 
{
    public static Object Extend(object toExtend)
    {
        var dyn = new DynamicObject(toExtend);
        dyn.MixWith(new WithId {
                                Id = Guid.New()
                               });
        var extended = dyn.CreateDuck<IWithId>(returnValue.GetType().GetInterfaces());
        return extended;
    }
}

搁置如何动态地保存财产或接口的问题,像你再次尝试做的那样,是用额外数据补充现有类别。 解决这一问题的一个非常典型的办法是使用<代码>Dictionary<Something, SomethingExtra>,并将其储存在维持制图的某些服务类别中。 现在,当你们需要获得一些外围服务时,你只是要求相关服务阶层提供相关信息。

优点:

  1. 执行比采用反思和动态代用代用代用办法更容易理解和维持。

  2. 如果你需要从所延长的类别中找到,则该类别可以密封。 对外联系信息与密封课相配合。

  3. 您可以联系信息,不必负责增量物体的建造。 你可以采取在任何地方制造的事例,并将新信息联系起来。

缺点:

  1. 你们需要注入维持绘图工作的服务。 如果你重新使用一种器、人工注射(通常通过建筑商通过),或者如果没有其他选择,则通过单一州固定入口,你可以通过IoC框架这样做。

  2. 如果你有为数众多的事例,而且正在迅速创造/消除,那么假冒的间接费用就会明显可见。 我怀疑,在发现间接费用之前,与代用执行相比,你需要一些非常沉重的负荷。

我已实际回答了上周的blog上查阅,这是我无耻的 p。

之后,使用Casa Dynamic Proxy几乎可以实现。 唯一的制约因素是,现有的“must号”试办了一个接口,你感兴趣的所有特性/方法都可以通过这一接口获得。

public static TIntf CreateMixinWithTarget<TIntf>(TIntf target, params object[] instances) where TIntf : class{

    ProxyGenerator generator = new ProxyGenerator();
    ProxyGenerationOptions options = new ProxyGenerationOptions();

    instances.ToList().ForEach(obj => options.AddMixinInstance(obj));

    return generator.CreateInterfaceProxyWithTarget <TIntf>(target, options);
}

[Test]
public void Should_extend_any_object()
{
    var thing = new Something { Name = "Hello World!"};
    var extended = CreateMixinWithTarget<ISomething>(thing, new WithId(), new GuidImpl());
    Assert.IsTrue(extended is IWithId);
    Assert.IsTrue(extended.Id is Guid);
    Assert.IsTrue(extened.Name == "Hello World!");
}




相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...

热门标签