3

次のようなオブジェクトからフィールドを抽出するメソッドを作成しました。

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'に変換できません

4

1 に答える 1

16

GetCustomAttributesメソッドは、object[]ではなくを返しますHTMLAttributes[]。それが返さobject[]れる理由は、.NETジェネリックが日の目を見る前に1.0からそこにあったからです。

戻り値の各項目を手動でにキャストする必要がありますHTMLAttributes

コードを修正するには、行を次のように変更するだけです。

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

foreachあなたのためにキャストの世話をします。

アップデート:

返された配列をにキャストしないでくださいHTMLAttributes[]。戻り値はではありませんHTMLAttributes[]。これobject[]は、タイプの要素を含みますHTMLAttributes。型付きオブジェクトが必要な場合HTMLAttribute[](この特定のコードスニペットでは必要ありませんが、これでforeach十分です)、配列の各要素を個別にHTMLAttribute;にキャストする必要があります。おそらくLINQを使用しています:

HTMLAttributes[] htmlAttributes = returnValue.Cast<HTMLAttributes>().ToArray();
于 2009-09-13T12:49:35.113 に答える