如何在C#中将==应用于泛型类型 - 如字符串或整数等数据类型

20 浏览
0 Comments

如何在C#中将==应用于泛型类型 - 如字符串或整数等数据类型

我有以下的通用类:\n

public class Entity
{
    public Key ID;
}
public interface IEntity
{
    T ID { get; set; }
}
public class GenericRepo
    where TEntity : class, IEntity
    where CEntity : class, IEntity
{
    protected readonly DataContext _context;
    protected readonly IMapper _mapper;
    public GenericRepo(DataContext context, IMapper mapper)
    {
        _context = context;
        _mapper = mapper;
    }
    public CEntity GetByID(Key id)
    {
        //在这里,我得到了'Key'和'Key'之间的运算符'=='不能应用于操作数的错误
        TEntity dbEntity = _context.Set().FirstOrDefault(e => e.ID == id);
        if (dbEntity == null)
        {
            return null;
        }
        return _mapper.Map(dbEntity);
    }
}

\n我正在尝试将泛型类型Key传递给ID属性。当我在传递的参数和Set的属性上使用==时,我得到了\'Key\'和\'Key\'之间的运算符\'==\'不能应用于操作数的错误,因为它们都是相同的泛型类型Key,那么我该如何在这些类中实现Key的相等性呢?\n我需要传递的类型是intstring。\n然而,我尝试为类添加一个where子句where T : Type,这样操作数的错误就消失了,但现在我不能像下面这样传递stringintEntity,我得到了\'int\'到\'System.Type\'的装箱转换错误。\n我看到一些答案建议使用.Equals并实现IComparer给类,但在我的情况下,它是一个类型,我需要==来在ef-core的LINQ to SQL中使用它。\n有没有适用于这个类的where条件,我可以传递一个类型给我的类并使用==或其他方法呢?

0
0 Comments

在使用C#中的泛型类型时,我们经常会遇到一个问题:如何将"=="操作符应用于泛型类型,比如字符串或整数。下面是一个例子,使用了一个简单的.Equals()方法来解决这个问题:

TDataSet dbEntity = _context.Set<TDataSet>().FirstOrDefault(e => e.ID.Equals(id));

以上代码中,我们使用了一个泛型类型TDataSet,并尝试使用"=="操作符进行比较。然而,由于泛型类型的特性,"=="操作符无法直接应用于泛型类型。

为了解决这个问题,我们使用了.Equals()方法。该方法是一个通用的对象比较方法,可以用于比较任意类型的对象。在以上代码中,我们使用.Equals()方法来比较了e.IDid两个对象。

通过使用.Equals()方法,我们可以在泛型类型中实现对象比较的操作。这种方法可以适用于任何类型的对象,包括字符串和整数等。

总结起来,当我们需要在泛型类型中进行对象比较时,由于"=="操作符无法直接应用于泛型类型,我们可以使用.Equals()方法来实现比较操作。这种方法是通用的,可以适用于任何类型的对象。

0
0 Comments

问题的出现原因是C#的泛型无法处理操作,因为操作是通过静态方法定义的。因此,无法直接使用等于操作符(==)来比较泛型类型。

解决方法是通过实现IComparable或类似接口来处理。通过使用IComparable接口,可以定义和比较泛型类型的操作。以下是一个示例代码来说明如何使用IComparable接口来比较泛型类型:

public class MyClass where T : IComparable
{
    public bool Compare(T item1, T item2)
    {
        return item1.CompareTo(item2) == 0;
    }
}

在上面的示例中,我们创建了一个名为MyClass的泛型类,其中的类型参数T必须实现IComparable接口。然后,我们定义了一个Compare方法,该方法接受两个泛型类型的参数,并使用IComparable接口的CompareTo方法来比较它们。如果两个参数相等,则返回true。

通过实现IComparable接口,我们可以在泛型类型中使用等于操作符(==)来比较两个对象。下面是一个使用示例:

MyClass myStringClass = new MyClass();
bool result = myStringClass.Compare("Hello", "Hello");
Console.WriteLine(result); // 输出:True
MyClass myIntClass = new MyClass();
bool result2 = myIntClass.Compare(10, 20);
Console.WriteLine(result2); // 输出:False

在上面的示例中,我们分别创建了一个泛型类型为string和int的MyClass对象,并使用Compare方法来比较它们。通过实现IComparable接口,我们可以在泛型类型中使用等于操作符(==)来比较两个对象,并得到预期的结果。

由于C#的泛型无法直接处理操作,我们需要通过实现IComparable或类似接口来处理泛型类型的等于操作。通过使用IComparable接口的CompareTo方法,我们可以比较泛型类型的对象,并使用等于操作符(==)来判断它们是否相等。

0