2009-03-27 2 views
1

Есть ли способ проверить, был ли задан экземпляр общего параметра в универсальном методе, когда он может быть либо значением, либо ссылочным типом? Я хотел бы иметь возможность сделать это в универсальном методе, который я должен использовать для сохранения типов, где T - это экземпляр, а K - тип поля идентификатора для этого типа (который все объекты, которые я сохраняю, имеют, поскольку они наследуются от базы тип). Я не хочу ограничивать K как тип значения. Код что-то вроде этого:Тестовое назначение для общего типа C#

public static bool Save<T, K>(T instance) 
{ 
    // variable to hold object identifer 
    K instanceId = default(K); 

    PropertyInfo[] properties = typeof(T).GetProperties(); 

    // loop through properties of the T 
    // if property is decorated with a specific attribute then assign to instanceId 
    // end loop 

    // check that we have a value assigned to instanceId other than default(K) 
    // if not return false otherwise continue to persist item 
} 

Как K может быть проверка типа значение, если оно равно по умолчанию (K) приводит к ошибке, поскольку это зависит от его быть сопоставимы. Есть ли способ обойти это?

Обратите внимание, что у меня возникла необходимость в этом в текущем случае, поставив условие на общий тип T, которое оно должно наследовать от базового типа BaseObject, поэтому мой вопрос касается общей проблемы, связанной с генериками и назначением тестирования.

ответ

5

Если вы собираетесь читать с instanceId позже, его необходимо обязательно назначить с помощью компилятора . Я хотел бы назначить его default(K) и отдельно иметь флаг говорят это или нет это было дано значение в полезно:

public static bool Save<T, K>(T instance) 
{ 
    bool idAssigned = false; 
    // variable to hold object identifer 
    K instanceId = default(K) 

    PropertyInfo[] properties = typeof(T).GetProperties(); 

    foreach(PropertyInfo property in properties) 
    { 
     if (SomeCondition(property)) 
     { 
      instanceId = GetId(property); 
      idAssigned = true; 
     } 
    } 

    if (!idAssigned) 
    { 
     return false; 
    } 
    Persist(whatever); 
    return true; 
} 

EDIT: Сравнивая значение instanceId с любой конкретное значение не является стартер, если вы не знаете, что значение никогда не будет использоваться для «нормального» значения, явно присвоенного instanceId.

В принципе, у вас есть два бита информации, поэтому держите их отдельно - флаг - это путь.

+0

Спасибо за это, я на самом деле делаю что-то вроде этого, назначая по умолчанию (K) и флаг, но он просто поразил нас как что-то, что вы можете захотеть, чтобы увидеть, было ли значение чем-то отличным от значения по умолчанию (K), но вы не можете сделать это, если не знаете, является ли это значением или ссылочным типом. –

+0

Я обновил вопрос, чтобы более четко отразить эту проблему вокруг проверки, равной по умолчанию (K) –

Смежные вопросы