【问题标题】:How to process data including protected members using extension method in C#如何在 C# 中使用扩展方法处理包括受保护成员在内的数据
【发布时间】:2021-07-18 13:08:14
【问题描述】:

最近,我需要使用子类的方法来处理基类中包含的私有数据。我的基类只能包含特定于域的类型(它只代表数据)。所以首先我决定在另一个项目中创建一个子类,并在其中实现处理逻辑。但问题是,一旦创建了基类的实例,就无法将其强制转换为子类型:

public class A
{
    protected int member1;
    public A(int value)
    {
        member1 = value;
    }
}

public class B : A
{
    public B (int value) : base(value)
    { }

    public void DoSomething()
    {
        Console.Write(member1 * member1);
    } 
}

class Program
{
    static void Main(string[] args)
    {
        A obj1 = new A(5);
        B obj2 = (B)obj1; // InvalidCastException
        obj2.DoSomething();   
    }
}

我开始考虑扩展方法。但是,您不能只从它们访问类的受保护字段。最后,我尝试将这两种方法结合起来。

【问题讨论】:

    标签: c# extension-methods nested-types


    【解决方案1】:

    这是我的解决方案:

    1. 确保允许您向基类添加新方法并且您的类未密封。
    2. 添加受保护的静态方法,该方法返回您需要的受保护成员。
    3. 为您的基类创建一个扩展类。
    4. 在扩展类中创建一个私有嵌套类。
    5. 从基类继承嵌套类。
    6. 在嵌套类中创建静态方法并在其中实现处理逻辑(可以从基类调用静态保护方法从基类获取受保护成员)。
    7. 在扩展类中创建扩展方法,并在其中调用嵌套类的静态方法。

    示例代码如下所示:

    public class A
    {
        protected int member1 = 0;
        public A() {}
        public A(int value)
        {
            member1 = value;
        }
    
        protected static int GetProtectedMember(A objA)
        {
            return objA.member1;
        }
    }
    
    public static class AExtensions
    {
        public static void DoSomething(this A objA)
        {
            B.DoSomething(objA);
        }
    
        private class B : A
        {
            public static void DoSomething(A objA)
            {
                // objA.member1 // it's not allowed
    
                int protectedFromA = A.GetProtectedMember(objA);
                int sqr = protectedFromA * protectedFromA;
                Console.WriteLine(sqr);
            }
        }
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            A obj1 = new A(5);
            obj1.DoSomething(); // 25
        }
    }
    

    这样,您可以将表示数据的类保留在单独的项目中,并在不同的项目中处理这些数据的多个实现。

    【讨论】:

    • 如果您有权向 A 添加一个方法,为什么其他所有方法都有效?似乎您不必要地扩展了 A 类,而不仅仅是使用 A 的实例作为输入。
    • 因为我想保护班级成员
    • 所有这些都是为了分离数据和可能的数据处理实现,因为每个可能的实现都可以有自己的依赖关系。
    • 但是您故意为子类添加了一个新的受保护方法,因此您现在正在创建一个了解 B 的 A 实现。这对我来说似乎不是正确的方法.如果您需要访问 member1 的值,只需创建一个公共 getter。似乎您正在做额外的工作只是为了对其进行任意保护。
    • 如果我创建一个公共getter,每个人都可以看到受保护字段的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 2014-10-11
    • 2015-08-04
    相关资源
    最近更新 更多