gpt4 book ai didi

c# - 访问函数内泛型类型的属性

转载 作者:行者123 更新时间:2023-11-30 22:56:44 28 4
gpt4 key购买 nike

我有一个通用函数 GetDocuments<T>那是在查询 CosmosDB API。泛型受自定义限制 IDocument界面。目前,我将一个枚举作为参数传递给这个确定文档类型的函数——但是,我的接口(interface)将文档类型作为一个属性,所以看起来我应该能够以某种方式访问​​它传递另一个参数。

因为我的论点在 Expression 中,我不确定如何访问该值(我不确定使用 API 访问表达式参数是否是正确的方法)。如果我有一个 IDocument作为论据,访问它似乎非常简单。

鉴于此代码,我如何访问 DocumentType不传递给 GetDocuments<T>

函数定义:

public IEnumerable<T> GetDocuments<T>(Expression<Func<T, bool>> predicate, Enumerations.DocumentType type) where T : IDocument
{
var results = Client.CreateDocumentQuery<T>(GetDocumentCollectionUri(), GetFeedOptions())
.Where(predicate)
.Where(s => s.DocumentType == type)
.ToList();

return results;
}

接口(interface)定义:

public interface IDocument
{
[JsonProperty(PropertyName = "id")]
string Id { get; set; }
[JsonProperty(PropertyName = "documentType")]
Enumerations.DocumentType DocumentType { get; }
}

函数调用:

var messages = mailboxRepository.GetDocuments<MailboxMessageTemplate>(
s => s.UserId == user.ID,
Enumerations.DocumentType.MessageTemplate);

最佳答案

您可以通过预先创建表达式并将其添加到查询中来做到这一点。

下面是可以解决问题的表达式。

internal static Expression<Func<T, bool>> TypeSpecificExpression<T>() where T : class
{
var parameter = Expression.Parameter(typeof(IDocument));
var member = Expression.Property(parameter, nameof(IDocument.Enumerations.DocumentType));
var contant = Expression.Constant(nameof(T));
var body = Expression.Equal(member, contant);
var extra = Expression.Lambda<Func<T, bool>>(body, parameter);
return extra;
}

然后您可以简单地将您的方法更改为:

public IEnumerable<T> GetDocuments<T>(Expression<Func<T, bool>> predicate) where T : IDocument
{
var results = Client.CreateDocumentQuery<T>(GetDocumentCollectionUri(), GetFeedOptions())
.Where(predicate && TypeSpecificExpression())
.ToList();

return results;
}

显然我无权访问 Enumerations.DocumentType 枚举,因此您可能需要对您在此处设置的值进行一些推文:var contant = Expression.Constant(nameof (T));

附带说明一下,您不应像在 CreateDocumentQuery 上那样调用 .ToList()。您正在同步一个可能会严重影响性能的查询。您应该使用 .AsDocumentQuery() 方法获取查询,然后在 query.HasMoreResults 时调用 query.ExecuteNextAsync

另一方面,您似乎正在尝试构建图书馆 Cosmonaut 的东西已经这样做了,包括您刚刚提出问题的功能(您可以找到该方法 here )。值得一看。

免责声明:我制作了宇航员

关于c# - 访问函数内泛型类型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54186793/

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