◆ チェイン中のキャストが見やすくなった

メソッドやプロパティを . つなぎで書いているときに間にキャストが入ってくるとカッコばっかりで見づらいですよね
var t1 = (Type1)value;
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;
            }
        }
    }
}

すごくシンプル
引数に値を入れればキャストできないときのデフォルト値にできます

使い方サンプル

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"); }
});
10


20
3
30
1