【发布时间】:2016-02-20 09:43:48
【问题描述】:
抱歉,因为我是泛型新手(我认为在这种情况下需要这样做)。
我想将 BindingList 变量传递给对已定义属性执行更新的方法,然后返回通过/失败(真/假)值。这似乎比我想象的要难,所以可以使用一些帮助。这是工作和非工作代码。
首先,我有一个带有 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 的方法中执行此操作(或其他返回成功或失败的方法)?
提前感谢您提供的任何帮助。
编辑:返回布尔值的要求是确保传递方法知道整个过程是否成功。更新了代码以显示这一点。
【问题讨论】:
-
你可以使用反射。但是您如何决定返回
true或false?设置属性值失败是什么意思?如果属性设置器中抛出异常? -
这对我来说是一个很好的澄清点。您应该假设在该方法中有其他登录,可以执行诸如从磁盘读取文件或解析信息等功能。如果在该过程中出现故障,则返回 true 或 false。
-
哪种方法?
SetField方法?例如BookMetaDataTitle属性调用此方法但忽略返回值。 -
也许我没有使用正确的术语。我所说的
Test方法调用ProcessBookTitle方法。当ProcessBookTitle运行时,我希望它更新传递的类变量的特定属性。我还希望Test方法知道所有代码都在ProcessBookTitle方法中正常运行。这有意义吗?如果我以错误的方式使用术语方法,我深表歉意。