문제

나는 다음과 같은 객체에서 필드를 추출하는 방법을 썼습니다.

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 () 메소드에 다음과 같은 빨간색 squiggly 선이 있습니다.

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[] .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();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top