簡體   English   中英

返回修改的泛型類型

[英]Return modified generic type

我試圖在創建對象后修改它。 我想將此對象的屬性設置為-1表示int或string.empty“”表示字符串。 貝婁是我已有的示例代碼。

class TestClassAccess{
    public int MyPropInt { get; set { ModifyOnAccessDenied<int>(value); } }
    public string MyPropString { get; set { ModifyOnAccessDenied<string>(value); } }

    public TestClassAccess() { }

    private T ModifyOnAccessDenied<T>(T propertyToChange) {
        var _hasAccess = false; //not really important how this is made
        if (!_hasAccess)
        {
            if (propertyToChange is string)
                propertyToChange = string.Empty;
            else if (propertyToChange is int)
                propertyToChange = -1;
        }            
        return  propertyToChange;
    }
}

所以..我遇到的問題。

  1. 它不編譯,因為我無法將屬性轉換為string或int。
  2. 如果我可以使用這樣的set方法,我不會結。
  3. 這是可能的,還是我要雄心勃勃。

謝謝KJ

如果要檢查通用函數中的特定類型,則可能是出錯了。 在這種情況下,您可以輕松傳入默認值,而不是硬編碼:

private T ModifyOnAccessDenied<T>(T newValue, T defaultValue) {
    var _hasAccess = false; //not really important how this is made
    if (!_hasAccess)
    {
        newValue = defaultValue;
    }            
    return newValue;
}

我還將propertyToChange重命名為newValue因為您在此函數中擁有的是新值,而不是屬性。

您的屬性定義也不起作用。 如果您需要在getter或設置中包含任何邏輯,則無法使用自動初始化程序語法,並且必須使用支持字段實現該屬性。

如果需要針對每種類型采取特定的操作,那么將此函數設置為通用似乎沒有意義。 這似乎更合適。

    class TestClassAccess
    {
        public int MyPropInt { get; set { ModifyOnAccessDenied<int>(value); } }
        public string MyPropString { get; set { ModifyOnAccessDenied<string>(value); } }

        public TestClassAccess() { }

        private static volatile bool _hasAccess = false;
        private string ModifyOnAccessDenied<string>(string propertyToChange)
        {
            if (!_hasAccess)
                return string.Empty;
            return propertyToChange;
        }
        private int ModifyOnAccessDenied<int>(int propertyToChange)
        {
            if (!_hasAccess)
                return -1;
            return propertyToChange;
        }
    }

但是,您可以使用動態執行此操作,但這確實需要.NET 4.0

private T ModifyOnAccessDenied<T>(T propertyToChange)
{
    if (!_hasAccess)
    {
        if (propertyToChange is string)
            return (dynamic)string.Empty;
        else if (propertyToChange is int)
            return (dynamic)(int)-1;
    }
    return propertyToChange;
} 

完全工作的樣品:

static class Program
{
    [STAThread]
    static void Main()
    {
        TestClassAccess test = new TestClassAccess();
        test.MyPropInt = 4;
        test.MyPropString = "TEST";
        Console.WriteLine("MyPropInt {0}, MyPropString '{1}'",test.MyPropInt, test.MyPropString);
        // Prints "MyPropInt -1, MyPropString ''
    }
    class TestClassAccess
    {
        private int myPropInt = 0;
        public int MyPropInt { get { return myPropInt; } set { myPropInt = ModifyOnAccessDenied<int>(value); } }
        private string myPropString = string.Empty;
        public string MyPropString { get { return myPropString; } set { myPropString = ModifyOnAccessDenied<string>(value); } }

        public static volatile bool _hasAccess = false;
        private T ModifyOnAccessDenied<T>(T propertyToChange)
        {
            if (!_hasAccess)
            {
                if (propertyToChange is string)
                    return (dynamic)string.Empty;
                else if (propertyToChange is int)
                    return (dynamic)(int)-1;
            }
            return propertyToChange;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM