■ 城東.NET
城東.NET #12 を開催しました。
城東.NET は東京の最近は秋葉原で毎月第3水曜日に開催している .NET 系の勉強会です。
発表を中心として、発表でなくとも最近やった事や新しい情報などを参加者で共有している会です。
今月の内容も、上記イベントサイトに資料やコメントが載っているものもあります。
興味があったら覗いてみてください。
■ 次回予定
来月は 10月18日(水)に開催の予定です。
.NET に関心のある方、是非遊びに来てください。
城東.NET #12 を開催しました。
城東.NET は東京の最近は秋葉原で毎月第3水曜日に開催している .NET 系の勉強会です。
発表を中心として、発表でなくとも最近やった事や新しい情報などを参加者で共有している会です。
今月の内容も、上記イベントサイトに資料やコメントが載っているものもあります。
興味があったら覗いてみてください。
来月は 10月18日(水)に開催の予定です。
.NET に関心のある方、是非遊びに来てください。
先日開催された(東京)Webフレームワーク品評会
にてお時間をいただいて 「私が ASP.NET を選ぶ理由」 というタイトルで話をさせていただきました。
概要としては、ASP.NET(.NET C#) なら同じ言語(環境)で Web だけでなくいろいろ作れるので、いろいろ作らなければならない時には検討してみてください。という内容です。
Web だけでなくアプリも作らなければならない場合に、Web API とアプリでコードを共有してモデルを合わせることでミスが減ることが期待できます。
当日は時間がなくて話しませんでしたが、同様の状況で何でも作れるライバルに JavaScript があると思います。
その点について、実際は一人で全部作ることも多いと思いますが私は各プラットフォーム毎に別々のエンジニアが作る人材の厚みを未だ夢見ています。
そういった場合を想定すると型にうるさい言語の方がメリットが大きい(ミスが少ない)と思うというスタンスです。
とりあえずそういった状況になった場合、最終的に選択することはできなくても一度 .NET の採用を検討してみてもらえると嬉しいです。
大量のプロパティを持つオブジェクト間でプロパティの値をコピーしたいことがあります。
毎回コピーするコードを書くのも面倒なので、メモをしておきます。
昨日のコードは型が異なる場合に使えなかったので、雑に型変換処理を入れてみました。
下記コードの PropertyCopier クラスの CopyTo メソッドでコピーできます。
public static class PropertyCopier { public static T CopyTo<T>(object src, T dest) { var it = typeof(int); if (src == null || dest == null) return dest; var srcProperties = src.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).Where(p => p.CanRead && p.CanWrite); var destProperties = dest.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).Where(p => p.CanRead && p.CanWrite); var properties = srcProperties.Join(destProperties, p => p.Name, p => p.Name, (p1, p2) => new { p1, p2 }); foreach (var property in properties) { if (property.p1.PropertyType == property.p2.PropertyType) { property.p2.SetValue(dest, property.p1.GetValue(src)); } else { var f = (property.p2.PropertyType == typeof(string)) ? v => Convert.ToString(v) : (property.p2.PropertyType == typeof(short)) ? v => Convert.ToInt16(v) : (property.p2.PropertyType == typeof(short?)) ? v => Convert.ToInt16(v) : (property.p2.PropertyType == typeof(bool)) ? v => Convert.ToBoolean(v) : (property.p2.PropertyType == typeof(bool?)) ? v => Convert.ToBoolean(v) : (property.p2.PropertyType == typeof(int)) ? v => Convert.ToInt32(v) : (property.p2.PropertyType == typeof(int?)) ? v => Convert.ToInt32(v) : (property.p2.PropertyType == typeof(long)) ? v => Convert.ToInt64(v) : (property.p2.PropertyType == typeof(long?)) ? v => Convert.ToInt64(v) : (property.p2.PropertyType == typeof(double)) ? v => Convert.ToDouble(v) : (property.p2.PropertyType == typeof(double?)) ? v => Convert.ToDouble(v) : (property.p2.PropertyType == typeof(decimal)) ? v => Convert.ToDecimal(v) : (property.p2.PropertyType == typeof(decimal?)) ? v => Convert.ToDecimal(v) : (property.p2.PropertyType == typeof(DateTime)) ? v => Convert.ToDateTime(v) : (property.p2.PropertyType == typeof(DateTime?)) ? v => Convert.ToDateTime(v) : (Func<object, object>)null; try { property.p2.SetValue(dest, f?.Invoke(property.p1.GetValue(src))); } catch { property.p2.SetValue(dest, null); } } } return dest; } } class Program { static void Main(string[] args) { var dest = PropertyCopier.CopyTo(new Test1() { Prop1 = "p1", Prop2 = "p2", Prop3 = "p3" }, new Test2()); Console.WriteLine($"{dest.Prop1}, {dest.Prop2}, {dest.Prop3}"); Console.ReadKey(); } } public class Test1 { public string Prop1 { get; set; } public string Prop2 { get; set; } public string Prop3 { get; set; } } public class Test2 { public string Prop1 { get; set; } public string Prop2 { get; set; } public string Prop3 { get; set; } }
大量のプロパティを持つオブジェクト間でプロパティの値をコピーしたいことがあります。
毎回コピーするコードを書くのも面倒なので、メモをしておきます。
下記コードの PropertyCopier クラスの CopyTo メソッドでコピーできます。
public static class PropertyCopier { public static T CopyTo<T>(object src, T dest) { if (src == null || dest == null) return dest; var srcProperties = src.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).Where(p => p.CanRead && p.CanWrite); var destProperties = dest.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).Where(p => p.CanRead && p.CanWrite); var properties = srcProperties.Join(destProperties, p => new { p.Name,p.PropertyType}, p => new { p.Name, p.PropertyType }, (p1, p2) => new { p1, p2 }); foreach (var property in properties) property.p2.SetValue(dest, property.p1.GetValue(src)); return dest; } } class Program { static void Main(string[] args) { var dest = PropertyCopier.CopyTo(new Test1() { Prop1 = "p1", Prop2 = "p2", Prop3 = "p3" }, new Test2()); Console.WriteLine($"{dest.Prop1}, {dest.Prop2}, {dest.Prop3}"); Console.ReadKey(); } } public class Test1 { public string Prop1 { get; set; } public string Prop2 { get; set; } public string Prop3 { get; set; } } public class Test2 { public string Prop1 { get; set; } public string Prop2 { get; set; } public string Prop3 { get; set; } }
Visual Studio 2017 Version 15.3.0 がリリースされました。
このリリースで C# 7.1 が使えるようになったので試してみます。
Visual Studio のアップデートは ツール > 拡張機能と更新プログラム から行えます。
プロジェクトを新規作成しただけでは C# 7.0 しか使えません。C# 7.1 を使うには設定を行う必要があります。
1. プロジェクトのプロパティ > ビルド
2. ページの右下の [詳細設定]
3. [ビルドの詳細設定] ダイアログの 全般 > 言語バージョン を
[C# の最新のマイナーバージョン (最新)]
または
[C# 7.1]
に設定。
C# 7.1 の新機能の一つ 推定タプル名 を使うには nuget で System.ValueTuple をインストールする必要があります。
https://github.com/dotnet/csharplang/blob/master/proposals/async-main.md
Main メソッドを async にできます。
static async Task Main(string[] args) { var text = await new System.Net.Http.HttpClient().GetStringAsync("http://rksoftware.hatenablog.com/"); Console.WriteLine(new string(text.Take(200).ToArray())); Console.ReadKey(); }
https://github.com/dotnet/csharplang/blob/master/proposals/generics-pattern-match.md
ジェネリック型の引数に対してのパターンマッチングが可能になりました。これまでは、下記の例では、Match<T>
メソッドの引数 a
に対するパターンマッチングはコンパイルエラーでした。
static void Main(string[] args) { Console.WriteLine(Match("test")); // string Console.ReadKey(); } static string Match<T>(T a) { switch (a) { case int v: return "int"; case string v: return "string"; default: return "default"; } }
https://github.com/dotnet/csharplang/blob/master/proposals/target-typed-default.md
型を推論できる個所では、規定値を設定する際の default(型名) の型名を省略できるようになりました。
static void Main(string[] args) { // これまでは default(int) の様に型の指定が必要だった int i = default; Console.WriteLine(i); Console.WriteLine(D()); Func<string> l = () => (string)default; Console.WriteLine(l() == null); string s = default; Console.WriteLine(s ?? default); Console.WriteLine(s == null? default:s); Console.ReadKey(); } static DateTime D() { return default; }
https://github.com/dotnet/csharplang/blob/master/proposals/csharp-7.1/infer-tuple-names.md
タプルの使用時に、要素の名前が推定で付けられるようになりました。推定できない場合(一つの変数が複数回使われた場合など)はこれまで通り、ItemX という名前になります。
static void Main(string[] args) { var pv = new System.Collections.Generic.KeyValuePair<int, int>(1, 2); var t1 = (pv.Value, pv.Key); // これまでは t.Item1 や t.Item2 となっていた Console.WriteLine(t1.Key); Console.WriteLine(t1.Value); int x = 3, y = 4; var t2 = (x, y); Console.WriteLine(t2.x); Console.WriteLine(t2.y); Console.ReadKey(); }
C# 7.1 はマイナーバージョンアップだけあって新機能は少ないですが、よりコードを書きやすくしてくれそうですぐに使いたいですね。
先日開催した
にて Bait and Switch を試してみた というタイトルで話をしました。
便利に使っているものの実際にどうなっているのかは確認していなかった Bait and Switch を試して確認してみました。
来月は 09月20日(水)に開催の予定です。
.NET に関心のある方、是非遊びに来てください。
.NET 読書会「プログラミング Xamarin 上」読書会を開催しました。
本会は毎週木曜日に開催して行く予定です。
今のところは読書と質問相談実践ということで始めました。いずれ LT などを積極的に行える場に育てて行けたらと思っています。
毎回簡単な概要のまとめを発表形式で共有するので、初心者の方でも安心な会(にして行くつもり)です。
書籍だけ握りしめて遊びに来てください。
今期の書籍は「プログラミング Xamarin 上」です。
読書会は、というか技術系の会は最初から参加していないと途中からは参加しずらいということはありません。
興味がありましたら、書籍だけ握りしめて気軽に遊でに来てください。
来月は 08月24日(木)に開催の予定です。