49. 難易度: 「可能にはなった」程度
• コンパイラーの中身に触れるようになっただけ
var props = propertyNames.Select(p => new Property(p)).ToArray();
var docComment = GenerateDocComment(props.Select(p => p.Name));
var parameterList = ParameterList().AddParameters(props.Select(p => p.ToParameter()).ToArr
var body = Block().AddStatements(props.Select(p => p.ToAssignment()).ToArray());
return ConstructorDeclaration(typeName)
.WithModifiers(SyntaxTokenList.Create(PublicToken))
.WithParameterList(parameterList)
.WithLeadingTrivia(docComment)
.WithBody(body)
.WithAdditionalAnnotations(Formatter.Annotation);
• 読めた代物じゃない
• 書くのも大変
/// <summary>Record Constructor</summary>
/// <param name="name"><see cref="Name"/></param>
/// <param name="x"><see cref="X"/></param>
/// <param name="y"><see cref="Y"/></param>
public Point(string name = default(string), int x = default(int), int y = default(int))
{
Name = name;
X = x;
Y = y;
}
50. 解析用の新構文が欲しい
• 型のパターン マッチング構文が欲しい
• C# 7.0で入りそう(確度高め)
• ぶっちゃけ、“内需”だと思う
var id = statement.Left as IdentifierNameSyntax;
if (id == null) continue;
if (id.Identifier.Text == p.Name)
return;
特定の型の場合だけ処理アナライザーを書いているとこういうコードだらけに
if (statement.Left is IdentifierNameSyntax id
&& id.Identifier.Text == p.Name)
return;
C# 7.0 提案
パターン マッチ
is演算子の拡張
53. メタプログラミングはまだ妥協的
• メタプログラミングでは
• 生成元・生成結果両方見えてほしい
• ただ、元と結果は明確に分離したい
public class Sample1
{
public string Name { get; set; }
public int X { get; set; }
public int Y { get; set; }
}
public class Sample1 : INotifyPropertyChanged
{
public int X { get { return x; } set { SetProperty(ref x, value, xPropertyChangedEventA
public int Y { get { return y; } set { SetProperty(ref y, value, yPropertyChangedEventA
#region NotifyPropertyChangedGenerator
public event PropertyChangedEventHandler PropertyChanged;
private int x;
private static readonly PropertyChangedEventArgs xPropertyChangedEventArgs = new Proper
private int y;
private static readonly PropertyChangedEventArgs yPropertyChangedEventArgs = new Proper
元情報
生成結果
• デバッグのためだけに見たい
• コードを書く上ではノイズ