【问题标题】:Writing extensions for inherited types为继承类型编写扩展
【发布时间】:2015-11-05 07:14:50
【问题描述】:

我正在尝试为我正在使用的某些类型编写几个扩展。基本类型是“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;
}

SetValues(ref input, field); 处的 ListField 类型错误的扩展。消息说,''ref' 参数类型与参数类型不匹配。'

也许这不是最好的方法,但我愿意选择。

【问题讨论】:

  • 在这种情况下为什么需要ref?我看不出有任何理由使用它...
  • 你不需要在这里使用ref,只需删除ref就可以了。

标签: c# extension-methods


【解决方案1】:

您可以在调用方法之前将其强制转换为局部变量:

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

除此之外,我不明白您为什么需要ref,如果不是ref,它无需转换即可工作。 C# requires that any ref parameters be of the exact type.

【讨论】:

【解决方案2】:

根据 cmets 中的建议,我删除了 ref 并且代码有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多