gpt4 book ai didi

c# - 如何模式匹配通用类型

转载 作者:太空宇宙 更新时间:2023-11-03 20:09:44 25 4
gpt4 key购买 nike

我想检测一个类型是否匹配某个类型模式。本例中的模式是 Expression<Func<T, bool>> ,其中 T 可以匹配任何类型(标准解释)。

鉴于这种模式,

Expression<Func<string, bool>> v;  //matches
Expression<string> v; //doesn't match
Expression<Func<string, string, bool>> v; //doesn't match

我的策略是比较测试类型的 FullName 的开头是否与泛型的 FullName 匹配。如果是,则通过 GetGenericArguments 剥离一层,然后重复检查。第一次检查代码:

Type testType;

Type firstCheck = (System.Linq.Expressions.Expression<>);
bool isExpression = testType.FullName.StartsWith(firstCheck.FullName);

这似乎可行,但相当丑陋。而且,它不是一个通用的解决方案;每个模式都需要自己的检查器功能。有没有人有更好的解决方案?

一个相关的问题是如何最好地表达一种模式?

最佳答案

使用GetGenericTypeDefinition method相反。

Type testType;

Type firstCheck = typeof(System.Linq.Expressions.Expression<>);
bool isExpression =
(testType.IsGenericType && testType.GetGenericTypeDefinition() == firstCheck)
|| (!testType.IsGenericType && testType == firstCheck);

更新

这是一个检查类型是否匹配给定模式的循环方法:

private static bool IsTypeCompatibile(Type pattern, Type test, Type placeholder)
{
if (pattern == test || pattern == placeholder)
return true;

if(pattern.IsGenericType)
{
if (!test.IsGenericType || pattern.GetGenericTypeDefinition() != test.GetGenericTypeDefinition())
return false;

var patternGenericTypes = pattern.GetGenericArguments();
var testGenericTypes = test.GetGenericArguments();

return patternGenericTypes.Length == testGenericTypes.Length
&& patternGenericTypes.Zip(testGenericTypes, (p, t) => IsTypeCompatibile(p, t, placeholder)).All(x => x);

}

return false;
}

用法:

var pattern = typeof(Expression<Func<Placeholder, bool>>);

var type1 = typeof(Expression<Func<string, bool>>);
var type2 = typeof(Expression<string>);
var type3 = typeof(Expression<Func<string, string, bool>>);

Console.WriteLine(IsTypeCompatibile(pattern, type1, typeof(Placeholder)));
Console.WriteLine(IsTypeCompatibile(pattern, type2, typeof(Placeholder)));
Console.WriteLine(IsTypeCompatibile(pattern, type3, typeof(Placeholder)));

打印

True
False
False

当然需要定义Placeholder类:

public class Placeholder
{ }

关于c# - 如何模式匹配通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20807919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com