首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我可以将这些函数重构为一个泛型函数吗?

我可以将这些函数重构为一个泛型函数吗?
EN

Stack Overflow用户
提问于 2017-12-13 18:01:55
回答 2查看 55关注 0票数 0

我有十几个继承自同一个基类的类。对于每个类,我希望在属性更新时更改状态,因此我有一个名为UpdateProperty(oldValue,newValue)的函数。我正在寻找一种方法来使这些泛型,这样当我添加一个新的类时,我不需要添加一个新的函数。这就是我所拥有的:

代码语言:javascript
运行
复制
    public TicketType UpdateProperty(TicketType oldValue, TicketType newValue)
    {
        if (oldValue != newValue && ObjectState != ObjectState.New && ObjectState != ObjectState.Deleted)
        {
            ObjectState = ObjectState.Changed;
        }
        return newValue;
    }

    public Layout UpdateProperty(Layout oldValue, Layout newValue)
    {
        if (oldValue != newValue && ObjectState != ObjectState.New && ObjectState != ObjectState.Deleted)
        {
            ObjectState = ObjectState.Changed;
        }
        return newValue;
    }

    public Division UpdateProperty(Division oldValue, Division newValue)
    {
        if (oldValue != newValue && ObjectState != ObjectState.New && ObjectState != ObjectState.Deleted)
        {
            ObjectState = ObjectState.Changed;
        }
        return newValue;
    }

    public MasterDataList UpdateProperty(MasterDataList oldValue, MasterDataList newValue)
    {
        if (oldValue != newValue && ObjectState != ObjectState.New && ObjectState != ObjectState.Deleted)
        {
            ObjectState = ObjectState.Changed;
        }
        return newValue;
    }

    public MasterDataListItem UpdateProperty(MasterDataListItem oldValue, MasterDataListItem newValue)
    {
        if (oldValue != newValue && ObjectState != ObjectState.New && ObjectState != ObjectState.Deleted)
        {
            ObjectState = ObjectState.Changed;
        }
        return newValue;
    }


    public Ticket UpdateProperty(Ticket oldValue, Ticket newValue)
    {
        if (oldValue != newValue && ObjectState != ObjectState.New && ObjectState != ObjectState.Deleted)
        {
            ObjectState = ObjectState.Changed;
        }
        return newValue;
    }

如您所见,它们都做同样的事情。有人能给我指个方向吗?

另请参阅https://dotnetfiddle.net/xXgRuv

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-13 18:13:53

我不仅要设置ObjectState,还要设置方法内部的属性值。

将该方法放在基类中。

代码语言:javascript
运行
复制
public abstract class BaseClass
{
    public ObjectState ObjectState { get; private set; }

    protected bool Set<T>( ref T field, T value )
    {
        if Equals( field, value ) return false;
        field = value;
        if ( ObjectState == ObjectState.Unchanged )
          ObjectState = ObjectState.Changed;
        return true;
    }
}

在继承的类中

代码语言:javascript
运行
复制
public class Foo : BaseClass
{
    private TicketType _ticketType;
    public TicketType TicketType 
    {
        get => _ticketType; 
        set => Set( ref _ticketType, value );
    }
}
票数 0
EN

Stack Overflow用户

发布于 2017-12-13 18:04:22

是的,但是你必须创建一个泛型方法。如果需要,您可以将其放在基类中:

代码语言:javascript
运行
复制
public T UpdateProperty<T>(T oldValue, T newValue)
{
    if (!object.Equals(oldValue, newValue) && this.ObjectState != ObjectState.New && this.ObjectState != ObjectState.Deleted)
    {
        this.ObjectState = ObjectState.Changed;
    }

    return newValue;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47790200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档