이 대답은 일부 사람들이 싫증나게 할 수도 있지만, 일부 사용자는 그것을 좋아할 것입니다. object initialization syntax의 이점을 제공하고 또한 유효성 검사기를 추가하거나, 개인 또는 읽기 전용 입력란에 매개 변수를 할당하거나, 객체 초기화 구문으로는 불가능한 다른 런타임 검사를 수행합니다.
요약 : 원하는 매개 변수가 포함 된 익명 객체 하나를 전달한 다음 약간의 리플렉션을 사용하여 읽습니다. 그런 다음
static class ObjectExtensions
{
//Helper method for reading the properties from an anonymous class
public static T Peek<T>(this object source, string propertyName)
{
var prop = source.GetType().GetProperty(propertyName, typeof(T));
return (prop == null) ? default(T) : (T)prop.GetValue(source);
}
}
object
로 입력 하나의 생성자 인자로 클래스를 정의
첫째,이 확장 방법을 만들 수 있습니다. 무엇이든 당신이 이렇게 원하는 매개 변수, 익명 형식을 사용하여 MyClass
를 인스턴스화 할 수 있습니다 지금
class MyClass
{
private readonly string _name;
private readonly int _id;
private readonly double _optional;
public MyClass(object o)
{
_name = o.Peek<string>("Name");
_id = o.Peek<int>("ID");
_optional = o.Peek<double>("Optional");
}
public void ProveThatItWorked()
{
Console.WriteLine(String.Format("ID = '{0}' Name = '{1}' Optional='{2}'", _id, _name, _optional));
}
}
:
MyClass c = new MyClass(new { Name = "My Name", ID = 17 });
c.ProveThatItWorked();
이를 사용하여 우리가 쓴 Peek
방법을 사용하여 값을 읽는 코드를 작성 기술을 사용하면 익명 객체에 원하는만큼 많은 명명 된 매개 변수를 전달할 수 있습니다. 단, 해당 문항을 읽으려면 Peek
문이 있어야합니다. 매개 변수가 익명 형식에 포함되어 있지 않으면 해당 매개 변수의 데이터 형식에 대한 기본값으로 되돌아갑니다. 사용되지 않는 매개 변수를 포함하면 무시됩니다. 당신이 원하는 경우
당신은이 도메인 형 객체에 대한 매우 강력하게하는 LINQ 쿼리에서 행을 전달할 수 있습니다
var list = from t in db.table
select new { ID = t.SomeIdentifier, Name = t.SomeName };
foreach (var i in list) {
var c = new MyClass(i);
c.ProveThatItWorked();
}
이 개체 초기화 구문 것을보십시오.
주의 사항 :
- 일반적 때문에 인텔리 오염
object
에 확장 방법을 정의 할 때 찌푸리게된다. 절 개인적으로 너무 괴롭히지 않았습니다.
- 이 방법은 컴파일 타임에 대부분의 실수를 잡지 않습니다.
int
이 예상되는 곳에서 string
을 전달하려고 시도하면됩니다. 이것은 Javascript 세계 또는 다른 duck-typed 언어에서 완전히 표준이지만 많은 사람들을 괴롭 히게됩니다. 그러나 컴파일 타임 검사를 원한다면 익명 클래스를 사용하는 대신 자신의 클래스를 정의한 다음 대신 전달하십시오.
잘 작동합니다. 감사! –