假设我有以下界面:
public interface IUserListVM
{
IList<string> UserList { get; }
}
Run Code Online (Sandbox Code Playgroud)
以及实现此视图模型接口的视图模型:
public class UserListVM : IUserListVM
{
private IList<string> userList = new List<string>();
IList<string> UserList
{
get { return userList; }
}
}
Run Code Online (Sandbox Code Playgroud)
然后可能有一个视图,期望一个继承IUserListVM的模型.假设我有一个UserList局部视图,看起来像这样:
@model MVCWebsite.Views.IUserListVM
@foreach (string user in Model.UserList) {
user
}
Run Code Online (Sandbox Code Playgroud)
这意味着将部分视图作为独立视图.
假设我有以下方法:
public static String GetString(int a) {
return "";
}
public static int GetInt(int a) {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在我想为这些方法之一创建 lambda 表达式,我只在编译时知道以下内容:
方法信息 方法信息;上述方法之一的方法信息。
属性类型 属性类型;上述方法之一的返回类型的属性类型。
我在这里不能使用泛型类型,因为我不知道我希望在编译时调用哪个方法。
设想:
我有以下模型类:
public class Model {
public String Name {
get;set;
}
public int Number {
get;set;
}
}
Run Code Online (Sandbox Code Playgroud)
在运行时我希望向该模型注入信息。
public static void Inject<T>(T model) {
foreach(PropertyInfo propertyInfo in typeof(T).GetProperties()) {
Func<int, object> funcGet = GetValueFunc(propertyInfo.PropertyType);
propertyInfo.SetValue(model, funcGet.Invoke(0));
}
}
public static Func<int, object> GetValueFunc(Type propertyType) {
MethodInfo methodInfo = // say I …Run Code Online (Sandbox Code Playgroud) 所以我要说我有以下几个类:
public class Model {
public AnotherModel InnerModel {
get;
set;
}
}
public class AnotherModel {
public String Value{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我有以下功能:
public static void Foo<T, U>(Expression<Func<T, U>> func) {
// Get the property info from func
}
Run Code Online (Sandbox Code Playgroud)
我现在想做的是以下内容:
Foo<Model, String>(o => o.InnerModel.Value)
Run Code Online (Sandbox Code Playgroud)
问题出现了:
我知道您可以通过执行以下操作从表达式func中获取PropertyInfo:
PropertyInfo propertyInfo = (PropertyInfo)((MemberExpression)func.Body).Member;
Run Code Online (Sandbox Code Playgroud)
这将获得Value属性的PropertyInfo.但是,我还想获取有关parent属性的信息,即InnerModel属性.
到目前为止我所知道的是我可以做到以下几点:
((MemberExpression)func.Body).Expression
Run Code Online (Sandbox Code Playgroud)
获取父属性的信息.但是,似乎无法从Expression本身提取PropertyInfo.
有没有办法实际检索Expression的PropertyInfo?
编辑:澄清一下,这可能是尝试它的一种不好的方式但是这里:我不能使用EntityFramework,只是为了确保理解它.
我需要通过API与数据库进行通信.
这个数据库得到了通常的关系,如方式:表线程UserID - > Users.UserID
现在提取到模型.要遵循上面的例子:
class Thread {
[Reference(USER_USERID)]
[TableKey(THREAD_USERID)]
public User user {
get;set;
}
}
class User {
[TableKey(USER_USERID)] …Run Code Online (Sandbox Code Playgroud) 我有如下文件:
{
"tags" => [
"tag1",
"tag2",
],
"name" => "Example 1"
}
{
"tags" => [
"tag1",
"tag3",
"tag4"
],
"name" => "Example 2"
}
Run Code Online (Sandbox Code Playgroud)
我现在想要的是进行术语搜索,其中给定的数组可能如下所示:
[tag1, tag3]
Run Code Online (Sandbox Code Playgroud)
预期命中应该是:
{
"tags" => [
"tag1",
"tag3",
"tag4"
],
"name" => "Example 2"
}
Run Code Online (Sandbox Code Playgroud)
但是,当我执行以下查询时:
GET _search
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": [
{
"terms": {
"tags": [
"tag1",
"tag3"
]
}
}
]
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
因为示例 1 …
这可能是一个远景,但无论如何我都会尝试.
让我们说我有这样的表达方式:
public class Foo {
public int Id { get; set; }
}
Expression<Func<Foo, bool>> expr = p => p.Id == 2;
Run Code Online (Sandbox Code Playgroud)
有没有办法打破表达,让我们说:
获取成员名称(expr.Body作为MemberExpression).Member.Name;
并获得相等比较的右侧值.也就是说,2.
或者这不可能吗?
我正在尝试创建一个具有自定义属性的类,如下所示:
public class Head : Attribute
{
public Head(Permissions permission, int id)
{
Permission = permission;
Id = id;
}
public int Id { get; private set; }
public Permissions Permission { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
其中 Permissions 是一个枚举:
public enum Permissions { R, W, D, RW, RWD }
Run Code Online (Sandbox Code Playgroud)
所以当我生成属性时:
var head = new CodeAttributeDeclaration
{
Name = "Head",
Arguments =
{
new CodeAttributeArgument
{
Value = new CodePrimitiveExpression(Permissions.RWD)
},
new CodeAttributeArgument
{
Value = new CodePrimitiveExpression(idValue);
}
} …Run Code Online (Sandbox Code Playgroud) c# ×4
lambda ×3
expression ×2
arrays ×1
asp.net-mvc ×1
codedom ×1
compile-time ×1
enums ×1
equality ×1
linq ×1
parent ×1
properties ×1
razor ×1
return ×1
term ×1