0

オブジェクトの作成後にオブジェクトを変更しようとしています。このオブジェクトのプロパティを、intの場合は-1に、文字列の場合は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

4

2 に答える 2

1

ジェネリック関数で特定の型をチェックしている場合は、おそらく何か間違ったことをしています。この場合、ハードコーディングするのではなく、デフォルト値を簡単に渡すことができます。

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

また、プロパティ定義は機能しません。ゲッターまたは設定にロジックを含める必要がある場合は、自動初期化構文を使用できず、バッキングフィールドを使用してプロパティを実装する必要があります。

于 2013-02-27T04:15:06.787 に答える
1

タイプごとに特定のアクションが必要な場合、この関数をジェネリックにする意味はないようです。これはより適切なようです。

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

ただし、ダイナミクスを使用してこれを行うことはできますが、これには.NET4.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;
        }
    }
}
于 2013-02-27T04:21:23.543 に答える