C#에서 반사를 사용하여 필드의 속성을 얻습니다.
-
07-07-2019 - |
문제
나는 다음과 같은 객체에서 필드를 추출하는 방법을 썼습니다.
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();