2015-08-12 2 views
-1

Я пытаюсь написать пару расширений для некоторых типов, с которыми я работаю. Базовый тип - «InputField». «ListField» наследуется от «InputField». Я покажу, что я пытаюсь сделать:Написание расширений для унаследованных типов

public static void LoadInputField(this InputField input, CustomField field) 
{ 
    SetValues(ref input, field); 
} 

public static void LoadInputField(this ListField input, CustomField field) 
{ 
    SetValues(ref input, field); 

    var optionItems = (from o in field.CustomFieldOptions 
         select new ListItem(o.OptionLabel, o.CustomFieldOptionId.ToString())); 
    input.AddChoices(optionItems.ToList()); 
} 

private static void SetValues(ref InputField input, CustomField field) 
{ 
    input.CustomFieldId = field.CustomFieldId; 
    input.ResponseTitle = field.ColumnName; 
    input.Prompt = field.ColumnCaption; 
    input.DisplayOrder = field.SortOrder; 
    input.Required = !string.IsNullOrEmpty(field.ColumnRequiredMessage); 

    input.ErrorClass = "text-danger"; 
    if (input.Required) 
     input.RequiredMessage = field.ColumnRequiredMessage; 
} 

Расширение для ошибок типа ListField на SetValues ​​(исх ввода, поле) ;. В сообщении говорится: 'Тип аргумента' ref 'не соответствует типу параметра.'

Возможно, это не лучший способ сделать это, но я открыт для вариантов.

+3

Зачем вам нужен 'ref' в этом случае? Я не вижу причин использовать его ... –

+2

Здесь вам не нужно использовать 'ref', просто удалите' ref', и он должен работать. –

ответ

0

Согласно рекомендациям в комментариях, я отказался от ref и код работает.

0

Вы можете бросить его на локальную переменную перед вызовом метода:

InputField inputField = (InputField)input; 
SetValues(ref inputField, field); 

Помимо этого я не понимаю, почему вам нужно ref, она работает без литья, если это не ref. C# requires that any ref parameters be of the exact type.

+2

Это будет работать, только если SetValues ​​фактически не использует ключевое слово 'ref'. [см. мою дискуссию с Патриком Хофманом] (http://stackoverflow.com/a/30027307/3094533) в комментариях к аналогичному ответу, который я дал кому-то несколько месяцев назад. –

+0

@ZoharPeled: хороший пункт. –

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