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

public abstract class DBBaseTable<T>
{
    public T Id { get; set; }
    public byte[] RowVersion { get; set; }
}

现在,我可以拥有类似的类: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....
}

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

我知道如何通过反射解决此问题,但是我想知道是否还有其他选择?

最佳答案

RowVersion移动到基类中。

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

public abstract class DBBaseTable<T> : DBBaseTable
{
    public T Id { get; set; }
}

10-04 15:46