是否可以在C#中的类属性中嵌套方法

时间:2015-12-02 03:57:38

标签: c# class properties

我有一个问题,我一直在寻找答案但尚未发现任何问题。这让我觉得我在搜索时没有正确地提出问题,所以我会提前为自己的困惑和缺乏知识而道歉。

我正在尝试确定它是否可行,如果可能,我将如何构造类以便属性附加其他自定义方法。如果感觉像是阶级的层次结构,就像我目前所做的那样非常平坦。这是一个非常简单的类和我尝试执行的例子:

更新

namespace Test
{
    public class MyClass
    {
        public string Value
        {
            get; set;
        }
        // HOW DO I CREATE 'AddRepetitiveCharacter(string Character, int Index)' for the 'Value' property?
    }

    static class Program
    {
        static void Main()
        {
            MyClass myclass = new MyClass();
            Label1.Text = myclass.Value.AddRepetitiveCharacter("-", 3);
        }
    }
}

如何获取Value属性并向其添加其他方法层,以便我可以对该属性执行其他操作?这可能吗?我注意到有了一个结构,比如DateTime,我可以做一个Datetime.Now ..我希望和我的班级做类似的事情......如果可能的话...我可以做的更传统:

Label1.Text = AddRepetitiveCharacter(myclass.Value,"-",3);

1 个答案:

答案 0 :(得分:2)

DateTime.Now是一个静态属性,它返回自己的struct的实例:

public struct DateTime
{
    public static DateTime Now
    {
        get {
            return /* */;
        }
    }

    public DateTime AddDays(int days) 
    {

    }

    /* All other members of DateTime struct */
}

由于属性类型是DateTime struct,它可以包含任何可以包含结构的成员。

同时,您的Exists会返回原始bool,但不能包含任何内容。

您可以让您的方法返回其他内容,例如自定义类或集合,以使其工作。

namespace Test
{
    public class ExistsClass
    {
        public bool Result { get; set; } = true;

        public int GetTotalCount() 
        {
            return Result ? 1 : 0;
        }
    }

    public class MyClass
    {
        public ExistsClass Exists { get; set; } = new ExistsClass();
    }

    static class Program
    {
        static void Main()
        {
            MyClass myclass = new MyClass();
            Console.WriteLine(myclass.Exists.GetTotalCount()); 
        }
    }
}

此代码段现在将输出1,因为默认情况下Result为真。

非常重要的注意事项:只有在架构,型号和逻辑方面确实有意义时才应该

例如,方法Exists拥有GetTotalCount方法听起来完全错误。存在的布尔事实(是/否)如何具有count属性?

更新

在您stringAddRepetitiveCharacter的示例中,听起来您不想要,也不需要自己的课程。您希望此属性为string,但具有一些扩展功能。这就是为什么我们有扩展方法 - 它允许你编写方法,它将扩展任何本机或你的自定义类的功能,并像类成员一样使用它:

public static class MyStringExtensions  
{
    public static string AddRepetitiveCharacter(this string originalString, char c, int count) 
    {
        return originalString + new String(c, count);
    }
}

然后,您将能够在项目的任何地方使用以下方式:

MyClass myclass = new MyClass();

// both are working and equivalent:
Label1.Text = myclass.Value.AddRepetitiveCharacter('-', 3);
Label1.Text = MyStringExtensions.AddRepetitiveCharacter(myclass.Value, '-', 3);

或只是

string text = "abc";

// both are working and equivalent:
Console.WriteLine(text.AddRepetitiveCharacter('-', 3)); // abc---
Console.WriteLine(MyStringExtensions.AddRepetitiveCharacter(text, '-', 3)); // abc---

请注意以下事项:

    方法参数之前的
  1. this
  2. 扩展类应该是静态的