As の拡張メソッドを作ると便利
◆ チェイン中のキャストが見やすくなった
メソッドやプロパティを . つなぎで書いているときに間にキャストが入ってくるとカッコばっかりで見づらいですよね
これをまとめてかくと
かっこがあってるのか確認だけでも大変です
as にしてもまだ見やすいとはいえません
ですが As メソッドを作ると
ちょっと長くて <>() が邪魔な感じはしますけど 外側を囲むカッコがなくて前から順に読んでいくだけで読めます
すごくシンプル
引数に値を入れればキャストできないときのデフォルト値にできます
var t1 = (Type1)value;
var t2 = (Type2)t1.prop;
var t3 = (Type3)t2.prop;
var t2 = (Type2)t1.prop;
var t3 = (Type3)t2.prop;
これをまとめてかくと
var t3 = (Type3)(((Type2)((Type1)value).prop).prop)
かっこがあってるのか確認だけでも大変です
as にしてもまだ見やすいとはいえません
var t3 = (((value as Type1).prop as Type2).prop as Type3
ですが As メソッドを作ると
var t3 = value.As<Type1>().prop.As<Type2>().prop.As<Type3>();
ちょっと長くて <>() が邪魔な感じはしますけど 外側を囲むカッコがなくて前から順に読んでいくだけで読めます
ソース
コードはこんなのnamespace liblib
{
public static class AsExtension
{
public static T As<T>(this object value, T default_value = default(T))
{
try
{
return (T)value;
}
catch
{
return default_value;
}
}
}
}
{
public static class AsExtension
{
public static T As<T>(this object value, T default_value = default(T))
{
try
{
return (T)value;
}
catch
{
return default_value;
}
}
}
}
すごくシンプル
引数に値を入れればキャストできないときのデフォルト値にできます
使い方サンプル
class TestClass
{
public int v { get; set; }
}
struct TestStruct
{
public int v;
}
object c = new TestClass { v = 10 };
object s = new TestStruct { v = 20 };
object t = "abc";
object i = 30;
new List<Action>
{
() => Console.WriteLine(c.As<TestClass>()?.v),
() => Console.WriteLine(s.As<TestClass>()?.v),
() => Console.WriteLine(c.As<TestStruct?>()?.v),
() => Console.WriteLine(s.As<TestStruct?>()?.v),
() => Console.WriteLine(t.As<string>()?.Length),
() => Console.WriteLine(i.As<int?>()?.ToString()),
() => Console.WriteLine(new List<int> { 1 }.As<IEnumerable<int>>().First()),
}.ForEach(e =>
{
try { e(); } catch { Console.WriteLine("exception"); }
});
{
public int v { get; set; }
}
struct TestStruct
{
public int v;
}
object c = new TestClass { v = 10 };
object s = new TestStruct { v = 20 };
object t = "abc";
object i = 30;
new List<Action>
{
() => Console.WriteLine(c.As<TestClass>()?.v),
() => Console.WriteLine(s.As<TestClass>()?.v),
() => Console.WriteLine(c.As<TestStruct?>()?.v),
() => Console.WriteLine(s.As<TestStruct?>()?.v),
() => Console.WriteLine(t.As<string>()?.Length),
() => Console.WriteLine(i.As<int?>()?.ToString()),
() => Console.WriteLine(new List<int> { 1 }.As<IEnumerable<int>>().First()),
}.ForEach(e =>
{
try { e(); } catch { Console.WriteLine("exception"); }
});
10
20
3
30
1
20
3
30
1