首页 新闻 会员 周边

C# 中如何确认一个对象是否是匿名对象

0
悬赏园豆:30 [已解决问题] 解决于 2023-01-23 18:06

请问在 C# 中如何检查一个对象的类型是否是 anonymous type ?

public static bool IsAnonymousType(dynamic obj)
{
    // Determine whether the obj is an anonymous type object
}
问题补充:

未完成的实现

static bool IsAnonymousType(dynamic obj)
{
    var emptyAnonymousType = new { }.GetType().ToString(); // <>f__AnonymousType0
    var currentAnonymousType = ((object)obj).GetType().ToString(); // <>f__AnonymousType1`1[System.String] 

    // TODO: 需要比较 currentAnonymousType 与 emptyAnonymousType 是否有相同的开头字符串 "<>f__AnonymousType"

    throw new NotImplementedException();
}

Console.WriteLine(IsAnonymousType(new { Title = "ASP.NET Core" }));
dudu的主页 dudu | 高人七级 | 园豆:31007
提问于:2023-01-23 12:19
< >
分享
最佳答案
0

实现了,通过 ReadOnlySpan.Slice 逐个字符比较

static bool IsAnonymousType(dynamic obj)
{
    if (obj == null) return false;

    var emptyAnonymousType = new { }.GetType().ToString();
    var currentAnonymousType = ((object)obj).GetType().ToString();
    return HasSamePrefix(currentAnonymousType, emptyAnonymousType, 8);
}

static bool HasSamePrefix(ReadOnlySpan<char> str1, ReadOnlySpan<char> str2, int minSameCharCount = 1)
{
    int len = Math.Min(str1.Length, str2.Length);
    int sameCharCount = 0;

    for (int i = 0; i < len && str1.Slice(i, 1).SequenceEqual(str2.Slice(i, 1)); i++)
    {
        sameCharCount++;
    }

    return sameCharCount >= minSameCharCount;
}

Console.WriteLine(IsAnonymousType(new { Title = "ASP.NET Core" })); // True
Console.WriteLine(IsAnonymousType(new { })); // True
Console.WriteLine(IsAnonymousType("ASP.NET Core")); // False
Console.WriteLine(IsAnonymousType(new BlogPost { Title = "ASP.NET Core" }));  // False
Console.WriteLine(IsAnonymousType(new ExpandoObject()));  // False

class BlogPost
{
    public string Title { get; set; }
}
dudu | 高人七级 |园豆:31007 | 2023-01-23 18:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册