有没有一种编写类似于语法的代码的方法:class.method(“ variable”)。returnedVariable

时间:2019-12-26 12:01:42

标签: c#

我正在努力提高对C#的理解。有没有办法以以下格式编写C#代码:

string name = Person("Dave").name;
int age = Person("Dave").age;

我知道这可以在Javscript中完成,并且我知道可以使用类似于以下内容的字典在C#中完成:

int age = Person["Dave"].age;

int age = Person.age("Dave");

我的理解是,字典选项将仅返回一个值,并且无法运行获取值“ age”的方法

我已经看到了一些与前两个示例相似的代码示例,但不了解如何编写或什至有可能。

2 个答案:

答案 0 :(得分:4)

如果您想使用这样的语法Person("Dave").name-您可以实现 helper

  namespace MyClasses {
    ...

    public static class PersonHelper {
      ...

      public static Person Person(string name) {
        //TODO: having name you should return Person instance, 
        // e.g. with a help of some dictionary:

        return Person.AllPersons.TryGetValue(name, out var result) 
          ? result
          : null;
     }
   }

让我们在AllPersons中实现此Person字典:

   public class Person {
     // Simplest, but not thread safe
     private static Dictionary<string, Person> s_AllPersons = new
       Dictionary<string, Person>();

     public Person(string name) {
       // When Person created we put the instance into the dictionary
       s_AllPersons.Add(name, this);

       Name = name;
     }

     public string Name {get;} 

     public static IReadOnlyDictionary<string, Person> AllPersons => s_AllPersons;

     ...
   }

然后添加using static以摆脱讨厌的PersonHelper名称:

    using static MyClasses.PersonHelper;

我们已经完成:

    string name = Person("Dave").Name;

此处Person("Dave")将被视为MyClasses.PersonHelper.Person("Dave"),它会为我们返回Person class实例,我们将读取其中的Name属性(或字段)

答案 1 :(得分:0)

您可以尝试通过“属性”和静态字典来做到这一点:

class Person {
  static public Dictionary<string, Person> Persons  {get; set;};

  public string Name {get; set; }

  public Person() 
  {
    if ( null == Persons ) Persons = new Dictionary<string, Person>();
  }
}

// Not tested, but shoud work
Person.Persons("dave")?.Name

但是它与Javascript或Python中的不一样。