gpt4 book ai didi

c# - 在 C# 中,如果我的对象支持该接口(interface),我如何检查 T 是否属于 IInterface 类型并强制转换为该类型?

转载 作者:可可西里 更新时间:2023-11-01 03:12:31 24 4
gpt4 key购买 nike

在 C# 中,我有一个使用 generics 传入 T 的函数,我想运行一个检查以查看 T 是否是一个object 实现了一个 interface,如果是的话调用那个 interface 上的 methods 之一。

我不想让 T 约束只属于那种类型。可以这样做吗?

例如:

public class MyModel<T> : IModel<T> where T : MyObjectBase
{
public IQueryable<T> GetRecords()
{
var entities = Repository.Query<T>();
if (typeof(IFilterable).IsAssignableFrom(typeof(T)))
{
//Filterme is a method that takes in IEnumerable<IFilterable>
entities = FilterMe(entities));
}
return entities;
}

public IEnumerable<TResult> FilterMe<TResult>(IEnumerable<TResult> linked) where TResult : IFilterable
{
var dict = GetDict();
return linked.Where(r => dict.ContainsKey(r.Id));
}
}

我得到的错误是:

错误 21 类型“TResult”不能用作泛型类型或方法“FilterMe(System.Collections.Generic.IEnumerable)”中的类型参数“TResult”。没有从“TResult”到“IFilterable”的隐式引用转换。

最佳答案

缺少的部分是Cast<>() :

if(typeof(IFilterable).IsAssignableFrom(typeof(T))) {
entities = FilterMe(entities.Cast<IFilterable>()).AsQueryable().Cast<T>();
}

注意 Cast<>() 的使用将实体列表转换为正确的子类型。除非 T,否则此转换将失败工具 IFilterable ,但由于我们已经检查过了,所以我们知道它会。

关于c# - 在 C# 中,如果我的对象支持该接口(interface),我如何检查 T 是否属于 IInterface 类型并强制转换为该类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16205864/

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