返回修改的泛型类型

时间:2013-02-27 04:06:27

标签: c# generics

我试图在创建对象后修改它。我想将此对象的属性设置为-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. 这是可能还是我有野心。
  4. Thank.s KJ

2 个答案:

答案 0 :(得分: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,因为您在此功能中拥有的是新值,而不是属性。

此外,您的属性定义也不起作用。如果您需要在getter或设置中包含任何逻辑,则无法使用auto-initializer语法,并且必须使用支持字段实现该属性。

答案 1 :(得分: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;
        }
    }
}