0

我正在尝试在创建对象后对其进行修改。我想将此对象的属性设置为 -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. 它无法编译,因为我无法将属性转换为字符串或 int。
  2. 如果我可以使用这样的设置方法,我不会打结。
  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;
}

我也重命名为propertyToChangenewValue因为您在此函数中拥有的是新值,而不是属性。

您的属性定义也将不起作用。如果您需要在 getter 或设置中包含任何逻辑,则不能使用自动初始化器语法,并且必须使用支持字段来实现该属性。

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

但是,您可以使用动态来执行此操作,但这确实需要 .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;
        }
    }
}
于 2013-02-27T04:21:23.543 回答