문제

나는 이것을 잘못 묻고 있을지도 모르지만 그 자체 내에서 수업에서 필드를 어떻게 찾을 수 있습니까 ... 예를 들어 ...

public class HtmlPart {
  public void Render() {
    //this.GetType().GetCustomAttributes(typeof(OptionalAttribute), false);
  }
}

public class HtmlForm {
  private HtmlPart _FirstPart = new HtmlPart();      
  [Optional] //<-- how do I find that?
  private HtmlPart _SecondPart = new HtmlPart();
}

아니면 그냥 이것을 잘못하고있을 수도 있습니다 ... 어떻게 메소드를 호출 한 다음 자체에 적용되는 속성을 확인할 수 있습니까?

또한 질문을 위해 - 속성 정보를 찾을 수 있는지 궁금합니다. 부모 수업을 모르거나 액세스하지 않고!

도움이 되었습니까?

해결책

당신의 질문을 올바르게 이해한다면, 당신이하려는 일이 불가능하다고 생각합니다 ...

에서 Render 방법, 객체에 가능한 속성을 적용하려고합니다. 속성은 필드에 속합니다 _SecondPart 마녀는 수업에 속합니다 HtmlForm.

그것이 작동하기 위해서는 호출 개체를 Render 방법:

    public class HtmlPart {
        public void Render(object obj) {
            FieldInfo[] infos = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

            foreach (var fi in infos)
            {
                if (fi.GetValue(obj) == this && fi.IsDefined(typeof(OptionalAttribute), true))
                    Console.WriteLine("Optional is Defined");
            }
        }
    }

다른 팁

다음은 주어진 단일 객체의 예입니다. 해당 개체의 공개 또는 개인 필드에 특정 속성이 있는지 확인하는 방법은 다음과 같습니다.

var type = typeof(MyObject);
foreach (var field in type.GetFields(BindingFlags.Public |
             BindingFlags.NonPublic | BindingFlags.Instance))
{
    if (field.IsDefined(typeof(ObsoleteAttribute), true))
    {
        Console.WriteLine(field.Name);
    }

}

질문의 두 번째 부분은 다음을 사용하여 현재 메소드의 속성이 Defiend인지 확인할 수 있습니다.

MethodInfo.GetCurrentMethod().IsDefined(typeof(ObsoleteAttribute));

편집하다

당신의 편집에 답하기 위해 예, 실제 유형을 모르면 가능합니다. 다음 함수는 유형 매개 변수를 사용하고 주어진 속성이있는 모든 필드를 반환합니다. 어딘가에 누군가가 검색하려는 유형을 알고 있거나 검색하려는 유형의 인스턴스를 갖게됩니다.

그 없이는 Jon Skeet이 말한대로 조립품의 모든 물건을 열거해야합니다.

   public List<FieldInfo> FindFields(Type type, Type attribute)
    {
        var fields = new List<FieldInfo>();
        foreach (var field in type.GetFields(BindingFlags.Public |
                           BindingFlags.NonPublic |
                           BindingFlags.Instance))
        {
            if (field.IsDefined(attribute, true))
            {
                fields.Add(field);
            }

        }
        return fields;
    }

사용 사용 클래스 내에서 필드를 찾을 수 있습니다 Type.GetFields, 그리고 당신은 사용을 사용하여 필드에 적용되는 속성을 찾을 수 있습니다. MemberInfo.GetCustomAttributes 또는 IsDefined - 그러나 특정 유형의 모든 필드를 찾아야한다면 다음을 수행해야합니다.

  • 검색하려는 모든 어셈블리를 반복하십시오
  • 각 어셈블리 내의 모든 유형을 반복하십시오
  • 각 유형 내의 모든 필드를 반복하십시오
  • 각 필드에 대한 속성의 존재/부재를 확인하십시오.

이제 실제로 찾으려고한다면 "이 '객체"에 대한 값이 값인 필드에 적용되는 특정 속성이라면 시스템의 모든 객체에 대해 모든 것을 알아야하기 때문에 더욱 어렵습니다. . 당신은 또한있을 수 있음을 명심해야합니다 동일한 값을 가진 필드, 즉 동일한 객체를 참조합니다. 이 경우 객체가 "선택 사항"으로 계산됩니까?

기본적으로, 객체에 속성이 있어야하는 경우 (예 : 선택 사항이든 아니든), 이는 속성을 포함하는 필드가 아니라 객체 자체의 속성이어야합니다.

당신이하려는 일을 잘못 해석하고있을 수도 있지만 나는 의심하다 그것은 실현 가능하지 않거나 적어도 좋은 생각이 아닙니다. 여기서 더 큰 그림을 설명해 주시겠습니까? 이 속성으로 실제로 무엇을 달성하려고합니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top