C# 作为带有泛型但不相关 <T> 的类型的运算符

Dry*_*ods 3 c# generics

我有一个带有泛型的抽象基类,我将针对这个问题简化它:

public abstract class DBBaseTable<T>
{
    public T Id { get; set; }     
    public byte[] RowVersion { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

现在,我可以有这样的课程:Person : DBBaseTable<int>Animal: DBBaseTable<Guid>

我试图避免反射,以便在我根本不知道T类型的代码的一部分中访问属性 RowVersion 。

var memberInfo = oldObject.GetType().BaseType;
if (memberInfo != null 
    && memberInfo.IsGenericType
    && memberInfo.GetGenericTypeDefinition() == typeof(DBBaseTable<>)
)
{   
    var isCorrectRowVersion = (oldObject as DBBaseTable<object>).RowVersion ==
                              (objToUpdate as DBBaseTable<object>).RowVersion;

    //TODO....  
}
Run Code Online (Sandbox Code Playgroud)

条件 IF 条件工作正常......但是当我尝试使用as运算符时,我总是需要指定T类型......我尝试使用“对象”但它不起作用......我根本不知道我是在处理 int、guid 还是其他类型的......

我知道如何通过反射解决这个问题,但我想知道是否有替代方案?

Sea*_*ean 12

将 移动RowVersion到基类中。

public abstract DBBaseTable
{
    public byte[] RowVersion { get; set; }
}

public abstract class DBBaseTable<T> : DBBaseTable
{
    public T Id { get; set; }     
}
Run Code Online (Sandbox Code Playgroud)

  • (您还可以使用带有“RowVersion”的接口,并在“DBBaseTable&lt;T&gt;”中实现它) (2认同)