我正在努力提高对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”的方法
我已经看到了一些与前两个示例相似的代码示例,但不了解如何编写或什至有可能。
答案 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中的不一样。