返回修改后的泛型类型

本文关键字:泛型类型 修改 返回 | 更新日期: 2023-09-27 18:01:31

我试图修改对象创建后。我想设置这个对象的属性为-1对于int或string。为字符串空"。下面是我已经拥有的示例代码。

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. 这是可能的还是我太雄心勃勃了?

Thank.sKJ

返回修改后的泛型类型

如果您正在检查泛型函数中的特定类型,则可能做错了什么。在这种情况下,你可以很容易地传入一个默认值,而不是硬编码:

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