繁体   English   中英

C# 作为带有泛型但无关紧要的类型的运算符<T>

[英]C# as operator on Type with generics but irrelevant <T>

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

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; }     
}

另一种选择是声明一个具有RowVersion属性的基接口并在DBBaseTable<T>基类中实现它

public interface IDBTable
{
    byte[] RowVersion { get; set; }
}

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

public class Person : DBBaseTable<int>
{
    //rest of logic
}

然后您无需RowVersion即可访问RowVersion属性

var isCorrectRowVersion = oldObject.RowVersion == objToUpdate.RowVersion;

使用接口,您可以在泛型类型中使用协变和逆变

此外,您可以在一个类中实现多个接口,但在DBBaseTable<T>只继承一个基类。 如果您将来需要扩展它,最好使用接口,IMO。 但最终决定取决于您的需求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM