相关疑难解决方法(0)

如何使用表达式设置属性值?

给出以下方法:

public static void SetPropertyValue(object target, string propName, object value)
{
    var propInfo = target.GetType().GetProperty(propName,
                         BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);

    if (propInfo == null)
        throw new ArgumentOutOfRangeException("propName", "Property not found on target");
    else
        propInfo.SetValue(target, value, null);
}
Run Code Online (Sandbox Code Playgroud)

如何编写它的表达式启用等效而无需为目标传递额外的参数?

为什么这样做而不是直接设置属性我可以听到你说.例如,假设我们有以下类,其属性具有公共getter但私有setter:

public class Customer 
{
   public string Title {get; private set;}
   public string Name {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我希望能够致电:

var myCustomerInstance = new Customer();
SetPropertyValue<Customer>(cust => myCustomerInstance.Title, "Mr");
Run Code Online (Sandbox Code Playgroud)

现在这里是一些示例代码.

public static void SetPropertyValue<T>(Expression<Func<T, Object>> memberLamda , object value)
{
    MemberExpression memberSelectorExpression; …
Run Code Online (Sandbox Code Playgroud)

c# linq expression

59
推荐指数
1
解决办法
4万
查看次数

如何将Expression <Func <T,DateTime >>转换为Expression <Func <T,object >>

我一直在寻找,但我找不到如何从该类型转换

Expression<Func<T, DateTime>>
Run Code Online (Sandbox Code Playgroud)

到类型:

Expression<Func<T, object>>
Run Code Online (Sandbox Code Playgroud)

所以我必须再次转向SO的广博知识;)

c# lambda

58
推荐指数
3
解决办法
2万
查看次数

无法将类型为"System.Linq.Expressions.UnaryExpression"的对象强制转换为"System.Linq.Expressions.MemberExpression"

我在C#中创建了一个方法来获取methodname

public string GetCorrectPropertyName<T>(Expression<Func<T, string>> expression)
{
   return ((MemberExpression)expression.Body).Member.Name; // Failure Point
}
Run Code Online (Sandbox Code Playgroud)

并称之为

string lcl_name = false;
public string Name
{
get { return lcl_name ; }
set 
    {
        lcl_name = value;
        OnPropertyChanged(GetCorrectPropertyName<ThisClassName>(x => x.Name));
}
}
Run Code Online (Sandbox Code Playgroud)

如果property是string,并且所有其他类型都提供此异常,则此方法正常:

无法将类型为"System.Linq.Expressions.UnaryExpression"的对象强制转换为"System.Linq.Expressions.MemberExpression".

  1. 我在方法签名中将字符串更改为对象,但随后又失败了.
  2. 我改变从打电话x => x.PropertyName到x => Convert.ToString(x.PropertyName),它仍然失败

我哪里错了?

c# linq exception-handling expression-trees

34
推荐指数
2
解决办法
2万
查看次数

解决WinForms中的跨线程异常

目前我正在使用WinForms(在C#中),我必须在后台运行该应用程序.为此我正在使用异步.当我运行应用程序时,它显示了一个例外

"跨线程操作无效:控制''从创建它的线程以外的线程访问."

我该如何解决这个错误?

c# multithreading winforms

8
推荐指数
1
解决办法
2万
查看次数

如何从表达式中为嵌套深度级别设置值?

我的问题与以下两个问题非常相似,但是我有一个附加要求,即这些问题不能满足。

就像那些问题一样,我有一个Expression<Func<TEntity, TProperty>>要在其中为指定属性设置值的地方。如果表达式的主体仅深一层,这些解决方案将非常有用,例如,x => x.FirstName但是如果该主体更深,它们将根本无法工作x => x.Parent.FirstName。

有什么方法可以采用这种更深层的表达式并将其值设置为?我不需要极其强大的执行延迟解决方案,但是我确实需要可以在对象上执行的操作,无论是1层还是多层,它都能正常工作。我还需要支持你期望在一个数据库中最典型的类型(long,int?,string,Decimal,DateTime?,等。虽然我不在乎像地理类型有关更复杂的事情)。

为了进行对话,我们假设我们正在处理这些对象,尽管假设我们需要深度处理N个级别,而不仅仅是1或2:

public class Parent
{
    public string FirstName { get; set; }
}

public class Child
{
    public Child()
    {
        Mom = new Parent(); // so we don't have to worry about nulls
    }

    public string FavoriteToy { get; set; }
    public Parent Mom { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

假设这是我们的单元测试: …

c# .net-4.0

5
推荐指数
1
解决办法
674
查看次数

使用Expression为对象赋值

我有这个使用Expression注入数据的注入器

    /// <summary>
    /// Inject a data to an instance of T
    /// </summary>
    /// <typeparam name="T">The type of object as parameter</typeparam>
    /// <param name="data">Object instance to where the data is injected</param>
    /// <param name="pairData">Set of data info</param>
    public static void InjectData<T>(this T data, Dictionary<Expression<Func<T, object>>, object> pairData) where T : IAuditable
    {
        // posible content of T data
        // Employee
        //      : Code
        //      : Name
        //      : ID

        // possible content of pairData
        // Key: a => a.Code …
Run Code Online (Sandbox Code Playgroud)

c# lambda expression

5
推荐指数
1
解决办法
1375
查看次数