如何共享具有相同属性的两个接口的所有属性

时间:2013-10-25 22:42:01

标签: c# .net interface

我有两个接口,两者都具有相同的确切属性。

万一你想知道为什么我有这样的两个界面这是一个很长的故事,但是,它必须是这样的。

如果条件是返回List的另一种方式,则根据条件返回List。

通过查看下面的接口和我的代码,我需要能够使用一个对象,换句话说,如果返回哪个接口并不重要,我需要能够使用一个对象而不是循环一个列出其他的接口和设置属性。

我需要这样的东西

compParts = genCompParts;

---代码用法

    public class ComponentParts : IComponentParts
    {
        public ComponentParts() { }
        public ComponentParts(Guid userID, int compID, bool isGeneric)
        {
            List<IComponentPart> compParts = null;
            List<IComponentPart_Max> genCompParts = null;

            if (isGeneric)
            {
                genCompParts = GenericCatalogBL.GenericCatalogManagerBL.GetComponentPartsMax(compID);
            }
            else
            {
                compParts = CatalogManagerDL.GetComponentParts(userID, compID);
            }

            var verParts = compParts.Where(x => x.CompTypeName.ToLower().Contains("vertical"));
            if (verParts.Count() > 0) { this.Vertical = verParts.ToList<IComponentPart>(); }

            var horParts = compParts.Where(x => x.CompTypeName.ToLower().Contains("horizontal"));
            if (horParts.Count() > 0) { this.Horizontal = horParts.ToList<IComponentPart>(); }

//... redundant code omitted

---界面快照---

Interface Snapshots


我最终创建了一个类库调用接口,我只是在我的解决方案中跨不同程序共享这些接口。

这是我应该首先做的,只是懒惰。

1 个答案:

答案 0 :(得分:0)

完全蛮力的方式,假设您没有IComponentPartIComponentPart_Max并且无法修复其中一个。

制作一个你控制的新界面

interface IComponentPart {
    string BrandGroup {get; set;}
    int BrandID {get; set;}
    // ...
}

为两个现有接口制作包装,使其适应您的界面

class IComponentPartWrapper : IComponentPart  {
    private readonly CatelogDL.IComponentPart _underlyingPart;

    public IComponentPartWrapper(CatelogDL.IComponentPart underlyingPart) {
        _underlyingPart = underlyingPart
    }

    public string BrandGroup {
        get {return _underlyingPart.BrandGroup;}
        set {_underlyingPart.BrandGroup = value;}
    }

    public int BrandID {
        get {return _underlyingPart.BrandID ;}
        set {_underlyingPart.BrandID = value;}
    }

    // ...
}

class IComponentPart_MaxWrapper : IComponentPart  {
    private readonly GenericCatalogDL.IComponentPart_Max _underlyingPart;

    public IComponentPartWrapper(GenericCatalogDL.IComponentPart_Max underlyingPart) {
        _underlyingPart = underlyingPart
    }

    public string BrandGroup {
        get {return _underlyingPart.BrandGroup;}
        set {_underlyingPart.BrandGroup = value;}
    }

    public int BrandID {
        get {return _underlyingPart.BrandID ;}
        set {_underlyingPart.BrandID = value;}
    }

    // ...
}

使您的代码使用您的界面,并将相应包装器中的任一库中的结果包装

public class ComponentParts : IComponentParts
{
    public ComponentParts() { }
    public ComponentParts(Guid userID, int compID, bool isGeneric)
    {
        List<IComponentPart> compParts;

        if (isGeneric)
        {
            compParts = GenericCatalogBL.GenericCatalogManagerBL.GetComponentPartsMax(compID)
                .Select(x => new IComponentPart_MaxWrapper(x))
                .ToList();
        }
        else
        {
            compParts = CatalogManagerDL.GetComponentParts(userID, compID)
                .Select(x => new IComponentPartWrapper(x))
                .ToList();
        }

        // ...