Mam abstrakcyjną klasę bazową z generycznie, uprościę to na to pytanie:
public abstract class DBBaseTable<T>
{
public T Id { get; set; }
public byte[] RowVersion { get; set; }
}
Teraz mogę mieć zajęcia jak: {x0}} lub Animal: DBBaseTable<Guid>
Próbuję uniknąć refleksji, aby uzyskać dostęp do rowversion obiektu w części kodu, w którym po prostu nie znam typu T
.
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....
}
Warunkowy, jeśli stan pracuje dobrze ... ale wtedy, gdy próbuję użyć operatora as
, zawsze muszę określić typ T
... Próbowałem użyć "obiektu", ale jest Nie działa ... i po prostu nie wiem, czy mam do czynienia z INT, GUID lub innym typem ....
Wiem, jak to rozwiązać z refleksją, ale chciałbym wiedzieć, czy jest alternatywa?
2 odpowiedzi
Przesuń RowVersion
do klasy bazowej.
public abstract DBBaseTable
{
public byte[] RowVersion { get; set; }
}
public abstract class DBBaseTable<T> : DBBaseTable
{
public T Id { get; set; }
}
Inną opcją jest zadeklarowanie interfejsu podstawowego z RowVersion
właściwość i wdrożenie go w DBBaseTable<T>
klasa bazowa
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
}
Następnie możesz uzyskać dostęp do nieruchomości RowVersion
bez odlewu
var isCorrectRowVersion = oldObject.RowVersion == objToUpdate.RowVersion;
Z interfejsami możesz używać