使用泛型更新特定属性(Winform C#)

时间:2016-02-20 00:56:22

标签: c# winforms generics

道歉,因为我是仿制药的新手(这是我认为在这种情况下需要的)。

我想将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的要求是确保传递方法知道整个过程是否成功。更新了代码以显示此信息。

1 个答案:

答案 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;
        }
    }