返回类实例c#的默认ToString()

时间:2015-06-20 08:42:46

标签: c#

我有一个名为Person的课程

public class Person
    { 
      string name;
      int age;
      SampleObject(string name, int age)
      {
      this.name = name;
      this.age = age;
      }
      public override string ToString() 
      {
         string s = age.ToString();
         return "Person: " + name + " " + s;
      }
    }

我已覆盖ToString()以返回此人的姓名。

我在另一个班级中使用该课程:

public class MyClass
{

public int Id {get;set;}

public Person person {get;set;}

}

现在,我希望以

的形式访问该类
MyClass my = new MyClass();

我希望在执行my.person时,它应该返回person类的ToString()值而不显式调用my.person.ToString()

是否有可能,如果可能的话,我该怎样才能实现这一目标。

由于

3 个答案:

答案 0 :(得分:3)

您可以创建另一个只读属性

public string PersonName { get {return this.person.ToString();} }

或添加检查可能的空值

public string PersonName 
{
    get 
    {
        return (this.person == null) ? String.Empty : this.person.ToString();
    }
}

根据您对同一财产设置Name人的评论 我认为分离/特定属性的方法将更易于维护

public string PersonName 
{
    get 
    {
        return (this.person == null) ? String.Empty : this.person.ToString();
    }
    set
    {
        if(this.person == null)
        {
            this.person = new Person(value, 0);
        }
        else
        {
            this.person.Name = value;
        }
    }
}

答案 1 :(得分:2)

我不太了解你的问题。但问题的一个解决方案是使用implicit cast

    public class Person
    {
        string name;
        int age;
        public Person(string name, int age)
        {
            this.name = name;
            this.age = age;
        }
        public override string ToString()
        {
            string s = age.ToString();
            return "Person: " + name + " " + s;
        }
        // here
        public static implicit operator string(Person d)
        {
            return d.ToString();
        }
    }
    public class MyClass
    {

        public int Id { get; set; }

        public Person Person { get; set; }

    }
    static void Main(string[] args)
    {
        var myclass = new MyClass();
        myclass.Person = new Person("test", 12);
        // use like this
        string name = myclass.Person;
        Console.WriteLine(name);
        Console.WriteLine("Press any key to continue.");
        Console.ReadLine();
    }

答案 2 :(得分:1)

您可以通过操作员过载来实现此目的。

public static implicit operator string(Person p)
{
    return p.ToString();
}

如果您希望在MyClass中实现运算符重载,那么它也会调用person。

public static implicit operator string(MyClass my)
{
    return my.person;
}

有了这个,你可以做类似

的事情
string personString = my;
// or my.person if you only implement it for Person

此外,您不需要为该年龄提供字符串变量。 执行以下操作会很好。

return "Person: " + name + " " + age;

我建议使用string.Format。

return string.Format("Person: {0} {1}", name, age);