使用通用类型

时间:2018-03-22 18:19:04

标签: c# xamarin xamarin.forms prism

我遇到了一个特殊的问题,即暂停我的应用程序的开发。我有一个选择器,用户可以从中选择付款类型(此应用程序不处理付款,其费用页面)。我在下面描绘了这个。

The picker

选择器后面是一个名为Payment Type的枚举。我已经使用了一些代码,并且即将将枚举名称转换为更令人愉悦的字符串格式(CreditCard - >信用卡)。

参考文献: enum set to string and get sting value when need https://alexdunn.org/2017/05/16/xamarin-tip-binding-a-picker-to-an-enum/

我正在使用MVVM和数据绑定来设置此选择器,这是拾取器绑定到的属性:

PaymentType _selectedPaymentMethod;
public string SelectedPaymentMethod
{
    set
    {
        var enumValue = _enumHelper.ConvertStringToPaymentTypeEnum(value);//ConvertStringToEnum<PaymentType>(value);

        if(SetProperty(ref _selectedPaymentMethod, enumValue))
        {
            _expenseItem.PaymentType = _selectedPaymentMethod;
            _canCreateExpense = validateForm();
        }
    }
    get
    {
        return _enumHelper.ConvertPaymentTypeEnumToString(_selectedPaymentMethod);//ConvertEnumToString<PaymentType>(_selectedPaymentMethod);
    }
}

在我们查看被调用的方法之前,让我们看看我们的枚举:

public enum PaymentType
    {
        [Description("None")] 
        None,

        [Description("Credit Card")] 
        CreditCard,

        [Description("Cash")] 
        Cash
    }

所以我有一个enum帮助器类,我用它来将枚举转换为字符串并返回。我发现如果将enum直接放入选择器中,我的文本格式很差,如果我格式化了文本,set事件从未被触发过。因此,我必须将我的枚举转换为List<string>以显示它并转换回处理它。此外,枚举的默认值为none,我从视图中隐藏,枚举默认为0,因此当我调用validate时,我的属性是如何设置的。

现在让我们看看我正在调用的方法:

public PaymentType ConvertStringToPaymentTypeEnum(string text)
{
    foreach (var value in Enum.GetValues(typeof(PaymentType)))
    {
        PaymentType enumValue = (PaymentType)value;

        if (text == enumValue.GetDescription())
        {
            return enumValue;
        }
    }

    return 0;
}

public string ConvertPaymentTypeEnumToString(PaymentType paymentType)
{
    foreach (var value in Enum.GetValues(typeof(PaymentType)))
    {
        PaymentType enumValue = (PaymentType)value;

        if (paymentType == enumValue)
        {
            return paymentType.GetDescription();
        }
    }

    return "";
}

这一切都很好,应用程序正常运行,看看它的实际效果:

The app running on non generic code

现在,这个enum方法被硬编码为1个enum类型,这两个方法是不可重用的...我不想要,因为我可能想在别处使用它。所以一旦我在这里实现它,我决定将这些方法转换为使用泛型类型,因此我可以将它们与其他枚举一起使用。让我们来看看我做了什么。

public T ConvertStringToEnum<T>(string text)
{
    foreach (var value in Enum.GetValues(typeof(T)))
    {
        T enumValue = (T)value;

        var enumVal = enumValue as Enum;

        if (text == enumVal.GetDescription())
        {
            return enumValue;
        }
    }

    return default(T);
}

public string ConvertEnumToString<T>(Enum @enum)
{
    foreach (var value in Enum.GetValues(typeof(T)))
    {
        Enum enumValue = (T)value as Enum;

        if (@enum == enumValue)
        {
            return @enum.GetDescription();
        }
    }

    return "";
}

现在,如果我调用这些新方法(注意它们之前已经注释掉),我会遇到最愚蠢的最不敏感的错误。两种方法都能工作并返回我想要的东西,但是再次调用setter并且方法返回默认值(特别是第一个方法,ConvertStringToEnum)

看看应用程序现在如何运行....

The app running on generic code

因此,当我将方法类型更改为泛型时,ProcessedState的setter会被调用两次....什么?

我不知道这里发生什么,谷歌搜索似乎没有帮助。什么在Xamarin的名字正在发生?

note 我正在使用Prism DryIos这个应用程序,但是我强烈怀疑它是否会导致这个问题。

0 个答案:

没有答案