道歉,因为我是仿制药的新手(这是我认为在这种情况下需要的)。
我想将BindingList变量传递给对已定义属性执行更新的方法,然后返回pass / fail(true / false)值。这看起来比我想象的要难,所以可以使用一些帮助。这是工作和非工作代码。
首先,我有一个带有BindingList(工作)的类:
public class BookMetaData : INotifyPropertyChanged
{
private string _bookMetaDataTitle;
[DescriptionLocalized(typeof(ResourcesClassBooks), "BookMetaDataTitleComment")]
[DisplayNameLocalized(typeof(ResourcesClassBooks), "BookMetaDataTitleDisplayName")]
public string BookMetaDataTitle { get { return _bookMetaDataTitle; } set { SetField(ref _bookMetaDataTitle, value, "BookMetaDataTitle"); } }
#region handle property changes
public event PropertyChangedEventHandler PropertyChanged;
protected bool SetField<T>(ref T field, T value, string propertyName)
{
//if the value did not change, do nothing.
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
//the value did change, so make the modification.
field = value;
return true;
}
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
接下来,我创建一个表示绑定列表(工作)的变量:
BindingList<BookMetaData> bookMetaData = new BindingList<BookMetaData>(); //metadata for the books
准备发送类变量和特定属性以更新为通用方法。请注意,这在技术上有效,但其余代码不适用:
private bool Test()
{
//the code below would probably be in a foreach loop and would not pass a single index.
ProcessBookTitle(bookMetaData, 0, typeof(BookMetaData).GetProperty(nameof(BookMetaData.BookMetaDataCoverage)));
return true;
}
我想要这个泛型方法(它被称为方法?)来更新BindingList类变量的指定属性。如果一般业务逻辑出现问题,则返回false。否则,返回true(不工作):
private void ProcessBookTitle<T>(BindingList<T> bindingList, int classIndex, PropertyInfo prop)
{
try
{
//do some things...
//If I manually wrote the next line, it would look like this:
//bookMetaData[0].BookMetaDataTitle = "My Book Title";
bindingList[classIndex].prop = "My Book Title"; //error = 'T' does not contain the information for 'prop'...
//maybe do some other things...
return true; //cannot find a way to return bool.
}
catch
{
//something went wrong somewhere, so return false.
return false; //does not work because cannot return a bool.
}
}
有没有办法可以发送类变量的名称和属性来更新到另一个方法?此外,是否可以在返回bool(和/或其他返回成功或失败的方式)的方法中执行此操作?
提前感谢您提供的任何帮助。
编辑:返回bool的要求是确保传递方法知道整个过程是否成功。更新了代码以显示此信息。
答案 0 :(得分:2)
你可以使用反射作为@Yacoub Massad提及。如果你想知道它是怎么回事。我们在这里做的是获取泛型类型T的类型并访问其属性信息。既然你提到从文件中读取,解析信息等,我建议你看看Delegate Actions With Return Values。但它自我是另一个故事。
static private bool ProcessBookTitle<T>(BindingList<T> bindingList, int classIndex, string propertyName)
where T : class
{
try
{
Type type = typeof(T);
PropertyInfo propertyInfo = type.GetProperty(propertyName);
object val = "Do some processing whatever here.";
propertyInfo.SetValue(bindingList[classIndex], Convert.ChangeType(val, propertyInfo.PropertyType), null);
return true;
}
catch (Exception ex)
{
// do something with the exception
return false;
}
}