是否可以将类型传递给IQueryable以在运行时实现。
像,
//Get type at runtime
Type type = Type.GetType("fully qualified class name");
IQueryable<type> test = // <-returned object of this type
实际问题如下: 下面我能够获得具有特定类型的右侧对象,但这不会转换为查询变量的类型。此外,我将知道查询类型。
Dictionary<string, Type> myDictionary = new Dictionary<string, Type>()
{
{ "tableName", typeof(tableName) }
};
//Below I am able to get right side object with specific type, but that is not casting to type of query variable. Also I will have known type for query.
IQueryable<Type> query= EFContext.Set(myDictionary[tableName]).AsQueryable();
稍后使用此查询对象通过动态传递select / where条件来选择数据。
var data = query.Select(x=> new
{
id= x.id,
name= x.name .. etc
}).ToList();
稍后我需要使用此测试变量来动态查询数据。
另外,请建议任何其他方法来解决此问题。
答案 0 :(得分:2)
如果你有一个你需要的IQueryable
类型的例子,你可以使用泛型方法来捕获类型 - 这个返回一个正确类型的null:
public static T NullByExample<T>(this T _) where T : class => (T)null;
如果您有返回项目的示例,则可以使用以下扩展名:
public static IEnumerable<T> EmptyByExample<T>(this T _) => Enumerable.Empty<T>();
在结果上使用AsQueryable
:
var test = EmptyByExample(classObject).AsQueryable();
或创建IQueryable
变体 - 遗憾的是,IQueryable
与[{1}}等效的确不是Enumerable.Empty
:
public static IQueryable<T> EmptyQueryByExample<T>(this T _) => Enumerable.Empty<T>().AsQueryable();
var test = EmptyQueryByExample(queryObject);
否则,如上所述,你处于反思的世界,这可能表明你做错了什么。问题是,在这种情况下,您会发现test
只能使object
成为type
类型,因为编译器无法知道var
代表什么,例如dynamic
是编译时的简写,除非您想使用UITableViewController
(并且您也不应该这样做)。
答案 1 :(得分:0)
有很多方法可以通过反思来做你所要求的,但可维护性会受到限制。您可能最好为类型创建共享接口并编写通用方法,如下所示:
interface IMyInterface
{
string SomeProperty {get;set;}
}
class MyClass : IMyInterface
{
public string SomeProperty {get;set;}
}
IQueryable<T> SomeMethod<T>() where T : IMyInterface, new()
{
var result = new List<T>() {
new T() { SomeProperty = "a"},
new T() { SomeProperty = "b"}
};
return result.AsQueryable();
}
因此,对泛型方法的调用可能是:
var temp = SomeMethod<MyClass>();