微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C#中的通用方法接受字符串或Guid作为输入

如何解决C#中的通用方法接受字符串或Guid作为输入

我正在努力弄清楚如何编写一个C#泛型方法,该方法将冷漠地使用stringGuid作为输入参数。
Guid原来是一个结构,因此这使事情变得更加复杂。

代码是:

public interface IBaseList<T>
{
    public T Id { get; set; }
}

此通用BaseList接口用于创建相似的实体:每个实体具有Guid主键,但单个实体使用string主键除外。现在,我正在尝试创建一种利用IBaseList的方法,并让我通过使用它们的主键来检索实体,而不必考虑其类型(stringGuid)。

到目前为止的代码

private T FindItem<T,S>(S id) where T : class,IBaseList<S> where S : class
{
    return Set<T>().Local.FirstOrDefault(o => o.Id == id) ?? Set<T>().FirstOrDefault(o => o.Id == id);
}

private T UpdateExistingItem<T,S>(T currentItem,S id) where T : class,IBaseList<S> where S : class
{
    var existingItem = FindItem<T,S>(id);
    if (existingItem != null)
    {
        Entry(existingItem).CurrentValues.SetValues(currentItem);
        return Entry(existingItem).Entity;
    };
    return currentItem;

调用string类型的方法时,这种方法可以正常工作

MyStringObject o = UpdateExistingItem<MyStringObject,string>(myStringObject,idtocheck);

但是当我尝试像这样使用Guid做同样的事情

MyGuidobject o = UpdateExistingItem<MyGuidobject,Guid>(myGuidobject,idtocheck);

我得到以下内容

The type 'Guid' must be a reference type in order to use it as parameter 'S' in the generic type or method 'MyContext.UpdateExistingItem<T,S>(T,S)'

我尝试使用where S : struct,但是当我这样做时又遇到另一个错误

CS0019  Operator '==' cannot be applied to operands of type 'S' and 'S' 

除了类似的问题(约束是对返回值而不是输入参数的约束)之外,我已经没有足够的想法了,对SO并没有太多了解。

解决方法

我认为您只需要T上的类约束,实际上您并不关心id字段是类还是结构;

private T FindItem<T,S>(S id) where T : class,IBaseList<S>
private T UpdateExistingItem<T,S>(T currentItem,S id) where T : class,IBaseList<S>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。