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?

3
Dryadwoods 6 marzec 2020, 12:51

2 odpowiedzi

Najlepsza odpowiedź

Przesuń RowVersion do klasy bazowej.

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

public abstract class DBBaseTable<T> : DBBaseTable
{
    public T Id { get; set; }     
}
12
Sean 6 marzec 2020, 09:53

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ć

Pavel Anikhouski 17 lipiec 2020, 12:23