Если GetAuditLogRecord
является универсальным методом, вам не нужно указывать тип, который он использует во время компиляции - вот почему, в конце концов, вы используете универсальные методы в первую очередь:
static void Main(string[] arguments)
{
int i = 0;
string s = "";
Test(i);
Test(s);
Console.ReadLine();
}
static void Test<T>(T arg)
{
Console.WriteLine(arg.GetType());
}
производит:
System.Int32
System.String
Обратите внимание, что мой пример не должен быть универсальным методом; он может принимать параметр типа object
и все еще работать. Методы должны быть общими, только если они создают новые переменные, используя параметры типа.
Я сомневаюсь, что вы на самом деле использовали бы дженерики для того, что вы пытаетесь сделать здесь. В дизайне, подобном тому, что вы описываете, я ожидаю, что GetAuditLog
будет иметь такую подпись:
AuditLogRecord GetAuditLog(IAuditable original, IAuditable current, AuditAction action, User user)
... где IAuditable
предоставляет свойства / методы, которые нужны AuditLogRecord
, а AuditAction
- перечисление. IAuditable
может выглядеть так:
interface IAuditable
{
List<KeyValuePair<string, object>> AuditableProperties;
}
Таким образом, любой объект, который может быть проверен, отвечает за представление списка имен / значений свойств, изменения которых относятся к журналу аудита, и объекту AuditLogRecord
не нужно больше ничего знать о деталях реализации объекты, которые он проверяет, чем это.