속성에 대한 setvalue 메서드를 찾을 수 없습니다. [중복]
모든 개체의 모든 필드를 반복하는 방법을 찾으려고합니다.
먼저 프로젝션을 사용하여 값 필드를 가져 와서 인쇄 해 보았습니다.
var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" };
foreach (PropertyInfo property in ob.GetType().GetProperties())
{
Console.WriteLine(property.Name + " val " + property.GetValue(ob));
}
그러나 물론 필드를 몇 가지 새로운 값으로 설정하고 싶으므로이를 읽은 후 다음과 같이 작동합니다.
foreach (PropertyInfo property in ob.GetType().GetProperties())
{
property.SetValue(ob,"new String");
}
이것은 나에게 "속성 설정 방법을 찾을 수 없음"을 제공합니다. 또한 일부 장소에서 수행되는 인수로 null을 제공하려고합니다.
property.SetValue(ob,"new String",null);
결과는 동일합니다. 왜 이것이 실패합니까?
편집 : 내 목표를 충분히 설명하지 않았다고 지적되었습니다. 위에서 언급했듯이 목표는 다음 예제 객체와 같이 모든 객체의 필드를 반복하는 것입니다.
var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" };
또한 원래 질문에서 "필드를 몇 가지 새 값으로 설정하고 싶습니다" 라고 썼습니다. 이것은 "ob"개체의 필드를 반복 하고 새 값으로 설정하고 싶다는 의미입니다.
감사합니다
답변
왜 이것이 실패합니까?
같은 이유로 글쓰기
ob.DeclarativeSecn = "new value";
적어도 당신이 준 예제에서는 컴파일 타임에 실패합니다. 객체는 익명 유형이고 익명 유형의 속성에는 getter 만 있으며 속성에 대한 새 값을 설정할 수 없습니다. 나중에 속성을 수정할 수 있도록하려면 익명 유형을 사용하지 마십시오.
귀하의 질문은 모든 객체 의 속성을 반복하는 것에 대해 이야기 했지만 다음과 같습니다.
- 인쇄 할 때 모든 속성에 게터가 있다고 가정합니다. 그것은 일반적으로 사실이지만 항상 그런 것은 아닙니다.
- 새 값을 설정할 때 모든 속성에 게터가 있고 문자열 속성 이라고 가정 합니다.
이러한 가정 중 어느 것도 일반적으로 옳지 않습니다 . 따라서 어떤 객체 든 처리 할 수 있으려면 더 많은 검사를 추가해야합니다.
익명 형식 은 형식을 먼저 명시 적으로 정의하지 않고도 읽기 전용 속성 집합을 단일 개체로 캡슐화하는 편리한 방법을 제공합니다 .
내 강조.
읽기 전용 속성에 값을 설정할 수없는 것 같습니다. 합리적으로 들립니다.