Chciałbym naśladować F # "z" słowa kluczowego (które mogą być używane na rekordach) w języku C#.Tworzenie metody "z" na immutables
Teraz, gdy tworzę nową klasę niezmienna, po prostu dodać ręcznie niektóre niestandardowe „z” metodami tak:
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);
}
}
Dla mojego osobistego C# rozwoju, starałem się stworzyć metody rodzajowe zrobić to (w idealnym świecie użyłbym F #). „Najlepsze” Zrobiłem coś takiego jak:
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)...
}
}
To działa, ale nie jestem całkiem zadowolony, bo tracę czas kompilacji błędów za pomocą parametru ciąg (na razie nie dbam o problemy z wydajnością).
Naprawdę chciałbym, aby móc napisać coś jak poniżej kod, gdzie zastąpi ciąg parametru przez „projekcji” lambda:
var myClass1 = new MyClass("name", "desc");
var myClass2 = myClass1.With(obj => obj.Name, "newName");
Moja metoda rozszerzenie będzie wyglądać następująco:
public static TSource With<TSource, TField>(
this TSource obj,
Expression<Func<TSource, TField>> projection,
TField value)
where TSource : class
{
// TODO
}
Więc oto moje pytania:
- Czy można użyć refleksji na resu projekcji lt i otrzymasz od niego nazwę pola?
- Czy ktoś już wykonał solidną metodę "z" w języku C#?
Edytowałem twój tytuł. Zobacz, "[Czy w tytułach pytania powinny znaleźć się" znaczniki "?] (Http://meta.stackexchange.com/questions/19190/)", gdzie konsensus brzmi "nie, nie powinien". –
Aby uzyskać pierwsze pytanie, zobacz http://stackoverflow.com/questions/671968/retrieving-property-name-od-lambda-expression. Twoja druga kwestia nie dotyczy tematu StackOverflow Obawiam się. –
Zobacz także http://stackoverflow.com/questions/2820660/get-name-of-property-as-a-string –