给出以下方法:
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) 我一直在寻找,但我找不到如何从该类型转换
Expression<Func<T, DateTime>>
Run Code Online (Sandbox Code Playgroud)
到类型:
Expression<Func<T, object>>
Run Code Online (Sandbox Code Playgroud)
所以我必须再次转向SO的广博知识;)
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".
x => x.PropertyName到x => Convert.ToString(x.PropertyName),它仍然失败我哪里错了?
目前我正在使用WinForms(在C#中),我必须在后台运行该应用程序.为此我正在使用异步.当我运行应用程序时,它显示了一个例外
"跨线程操作无效:控制''从创建它的线程以外的线程访问."
我该如何解决这个错误?
我的问题与以下两个问题非常相似,但是我有一个附加要求,即这些问题不能满足。
就像那些问题一样,我有一个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)
假设这是我们的单元测试: …
我有这个使用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)