gpt4 book ai didi

c# - 在不指定尽可能多的类型的情况下调用通用扩展方法

转载 作者:太空狗 更新时间:2023-10-29 22:26:56 24 4
gpt4 key购买 nike

这是我用来测试类型扩展方法的类的片段:

class Something
{
[StringLength(100, MinimumLength = 1, ErrorMessage = "Must have between 1 and 100 characters")]
public string SomePublicString { get; set; }
}

我有以下扩展方法:

public static class TypeExtensions
{
public static TAttributeType GetCustomAttribute<T, TAttributeType, TProperty>(this T value, Expression<Func<T, TProperty>> propertyLambda, bool inherit = false)
{
var type = typeof(T);
var member = (MemberExpression)propertyLambda.Body;
var propertyInfo = (PropertyInfo)member.Member;
var customAttributes = propertyInfo.GetCustomAttributes(typeof(TAttributeType), inherit);

return customAttributes.OfType<TAttributeType>().FirstOrDefault();
}
}

单元测试中的用法:

1:  var something = new Something();
2: var actual = something.GetCustomAttribute<Something, StringLengthAttribute, string>(x => x.SomePublicString);

3: actual.MinimumLength.Should().Be(1);
4: actual.MaximumLength.Should().Be(100);
5: actual.ErrorMessage.Should().Be("Must have between 1 and 100 characters");

这将返回通过测试(使用 FluentAssertions)。

但是,我想将第 2 行中对 GetCustomAttribute() 的方法调用简化为以下内容:

var actual = something.GetCustomAttribute<StringLengthAttribute>(x => x.SomePublicString);

这可能吗?我错过了什么吗?也许我正在咖啡因崩溃。 :(

最佳答案

不,您要么必须指定所有 类型参数,要么一个都不指定。没有“部分”类型推断。

但是,有时您可以避免这种情况的一种方法是使用一个带有单个类型参数的泛型方法,该方法返回一个泛型类的实例,然后对其使用类型推断来完成其余的工作 - 反之亦然。在这种情况下,实际上最好将属性提取与其余部分分开:

something.GetPropertyAttributes(x => x.SomePublicString)
.FirstAttribute<StringLengthAttribute>();

这里第一个方法调用推断出 TTProperty - 并且只返回一个 IEnumerable<Attribute>FirstAttribute只会做 OfType/FirstOrDefault电话。 (您甚至可能决定不需要 FirstAttribute,因为自己调用 OfTypeFirstOrDefault 非常简单。)

关于c# - 在不指定尽可能多的类型的情况下调用通用扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15816115/

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