我编写了一种从这样的对象中提取字段的方法:

private static string GetHTMLStatic(ref Object objectX, ref List<string> ExludeFields)
{
    Type objectType = objectX.GetType();
    FieldInfo[] fieldInfo = objectType.GetFields();

    foreach (FieldInfo field in fieldInfo)
    {
        if(!ExludeFields.Contains(field.Name))
        {
            DisplayOutput += GetHTMLAttributes(field);
        }
    }

    return DisplayOutput;
}


类中的每个字段也都有自己的属性,在这种情况下,我的属性称为HTMLAttributes。在foreach循环中,我试图获取每个字段的属性及其各自的值。当前看起来像这样:

private static string GetHTMLAttributes(FieldInfo field)
{
    string AttributeOutput = string.Empty;

    HTMLAttributes[] htmlAttributes = field.GetCustomAttributes(typeof(HTMLAttributes), false);

    foreach (HTMLAttributes fa in htmlAttributes)
    {
        //Do stuff with the field's attributes here.
    }

    return AttributeOutput;
}


我的属性类如下所示:

[AttributeUsage(AttributeTargets.Field,
                AllowMultiple = true)]
public class HTMLAttributes : System.Attribute
{
    public string fieldType;
    public string inputType;

    public HTMLAttributes(string fType, string iType)
    {
        fieldType = fType.ToString();
        inputType = iType.ToString();
    }
}


这似乎合乎逻辑,但无法编译,我在GetHTMLAttributes()方法中的红色波浪线如下:

field.GetCustomAttributes(typeof(HTMLAttributes), false);


我试图从中提取属性的字段位于另一个这样使用的类中:

[HTMLAttributes("input", "text")]
public string CustomerName;


根据我的理解(或缺乏理解),这应该起作用吗?请扩大我的同胞开发人员的视野!

*编辑,编译器错误:


  无法隐式转换类型
  'object []'到'data.HTMLAttributes []'。
  存在显式转换(您是
  缺少演员表?)


我试过像这样铸造它:

(HTMLAttributes)field.GetCustomAttributes(typeof(HTMLAttributes), false);


但这也不起作用,我得到了这个编译器错误:


  无法将类型'object []'转换为
  'data.HTMLAttributes'

最佳答案

GetCustomAttributes方法返回一个object[],而不是HTMLAttributes[]。它返回object[]的原因是从1.0开始,.NET泛型尚未出现。

您应该手动将返回值中的每个项目强制转换为HTMLAttributes

要修复您的代码,只需要将行更改为:

object[] htmlAttributes = field.GetCustomAttributes(typeof(HTMLAttributes), false);


foreach将为您处理演员。

更新:

您不应该将返回的数组强制转换为HTMLAttributes[]。返回值不是HTMLAttributes[]。这是包含类型为object[]的元素的HTMLAttributes。如果要使用HTMLAttribute[]类型的对象(在此特定代码段中不需要,foreach就足够了),则应将数组的每个元素分别转换为HTMLAttribute;也许使用LINQ:

HTMLAttributes[] htmlAttributes = returnValue.Cast<HTMLAttributes>().ToArray();

10-07 20:19