C#에서 'with'키워드 (레코드에서 사용할 수 있음)를 모방하고 싶습니다. 나는 새로운 불변의 클래스를 만들 때immutables에 "with"메서드 만들기
지금, 난 그냥 같은 방법 "과"수동으로 일부 사용자를 추가
내 개인 C#을 개발public class MyClass
{
public readonly string Name;
public readonly string Description;
public MyClass(string name, string description)
{
this.Name = name;
this.Description = description;
}
// Custom with methods
public MyClass WithName(string name)
{
return new MyClass(name, this.Description);
}
public MyClass WithDescription(string description)
{
return new MyClass(this.Name, description);
}
}
, 내가 할 수있는 일반적인 방법을 만들려고 이 (완벽한 세계에서 나는 F #을 사용할 것입니다). "최고"내가 그랬어입니다 같은 :
public static class MyExtensions
{
public static TSource With<TSource, TField>(
this TSource obj,
string fieldName,
TField value)
where TSource : class
{
// Reflection stuff to use constructor with the new value
// (check parameters names and types)...
}
}
그것은 작동하지만 내가 (지금은 성능 문제의 상관하지 않습니다에 대한) 문자열 매개 변수를 사용하여 시간 오류를 컴파일 상실 때문에 나는 매우 만족 아니에요.
정말 내가 "투사"람다하여 문자열 매개 변수를 대체 아래 코드처럼 뭔가를 쓸 수 있도록하고 싶습니다:
var myClass1 = new MyClass("name", "desc");
var myClass2 = myClass1.With(obj => obj.Name, "newName");
과 같이 보일 것 내 확장 방법 :
를- 이 가능 투사의 resu에 반사를 사용하는 것입니다
public static TSource With<TSource, TField>( this TSource obj, Expression<Func<TSource, TField>> projection, TField value) where TSource : class { // TODO }
그래서 여기 내 질문 있습니다 그것에서 필드 이름을 얻으려고?
- 다른 사람이 이미 C#에서 강력한 "with"방법을 사용 했습니까?
제목을 편집했습니다. "[제목에"태그 "가 포함되어 있어야합니까?] (http://meta.stackexchange.com/questions/19190/)"합의가 "아니오, 그렇지 않아야합니다"로 표시되어야합니다. –
첫 번째 질문은 http://stackoverflow.com/questions/671968/retrieving-property-name-from-lambda-expression을 참조하십시오. 두 번째는 StackOverflow에 대한 주제가 아닙니다. 두려워요. –
http://stackoverflow.com/questions/2820660/get-name-of-property-as-a-string –