gpt4 book ai didi

c# - 未找到属性设置方法,异常 System.ArgumentException

转载 作者:行者123 更新时间:2023-12-03 09:09:35 27 4
gpt4 key购买 nike

我正在尝试复制属性以更新代码中的供应商

这是我的供应商更新方法

public bool UpdateSupplier(PurchaseOrderHeader header, string newSupplier)
{
try
{
var oldSupplier = GetSupplierForPoHeader(header);
Reflection.CopyPropertyValues(oldSupplier, newSupplier);
Console.WriteLine($"{oldSupplier} : {newSupplier}");
_context.SaveChanges();
return true;
}
catch (Exception ex)
{
Logger.LogException(ex);
throw;
}
}

这是我更新值的方法。

public static void CopyPropertyValues(object source, object destination)
{
try
{
var destProperties = destination.GetType().GetProperties();

foreach (var sourceProperty in source.GetType().GetProperties())
foreach (var destProperty in destProperties)
{
if (destProperty.Name != sourceProperty.Name ||
!destProperty.PropertyType.IsAssignableFrom(sourceProperty.PropertyType) ||
destProperty.Name == "Id")
continue;

destProperty.SetValue(destination, sourceProperty.GetValue(source, new object[] { }),
new object[] { });
break;
}
}
catch (Exception e)
{
Console.WriteLine(@"Inner Exception: "+e.InnerException?.Message);
Console.WriteLine(@"Message: "+e.Message);
}
}

有什么想法吗?

我检查了其他堆栈溢出问题,似乎没有一个能解决我的问题,我对反射还很陌生,所以我不知道如何自己解决这个问题。

最佳答案

检查这些:

  • 您尝试设置的属性需要有一个 setter 。 (PropertyInfo.CanSet)
  • setter 是私有(private)的,您必须告诉 SetValue 方法,它应该使用 BindingFlags (或使用下面的代码)来设置它。
  • 属性派生且setter是私有(private)的,并且仍想设置它,则需要从DeclaringType中获取该属性,因为在派生类上找不到私有(private)成员(但在属性是因为公共(public) getter)或使用下面的代码。

如果您想访问私有(private) setter ,您可能会发现这很有用:

var setterMethod = propertyInfo.GetSetMethod(true);
setterMethod.Invoke(instance, new [] { value });

请注意,您还可以获得索引器作为属性。他们提出了一个额外的论点。您可能还想排除它们 (!propertyInfo.GetIndexParameters().Any())。

关于c# - 未找到属性设置方法,异常 System.ArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43846576/

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