这是一个
奇怪的问题,但我想了想,很好奇:
假设我有一个类:
public class Person{
public String name;
public Person(String _name){
name = _name;
}
public void TellMyName(){
Console.WriteLine(name);
}
}
然后,在代码中的某个地方,我创建了一个 Person 的实例。
Person p = new Person("John");
有没有办法让我编写p()
(就好像它是函数调用一样)并触发p.TellMyName()
?
Person p = new Person("John");
p();
//output: John
如果适合
您,您可以通过获取委托来完成所需的语法:
public class Person
{
public string _name;
public Person(string name)
{
_name = name;
}
public void TellMyName()
{
Console.WriteLine(_name);
}
}
// ...
var o = new Person("John");
var p = (Action)o.TellMyName;
p();
或者,您可以将构造函数更改为 Create 方法并具有以下内容:
public class Person
{
public string _name;
private Person(string name)
{
_name = name;
}
public static Action Create(string name)
{
return new Person(name).TellMyName;
}
public void TellMyName()
{
Console.WriteLine(_name);
}
}
// ...
var p = Person.Create("John");
p();
加倍努力?好的,我们开始:
public class Person : System.Dynamic.DynamicObject
{
public string _name;
public Person(string name)
{
_name = name;
}
public void TellMyName()
{
Console.WriteLine(_name);
}
public override bool TryInvoke(
System.Dynamic.InvokeBinder binder, object[] args, out object result)
{
result = null;
if (args.Length == 0)
{
TellMyName();
return true;
}
return false;
}
}
// ...
dynamic p = new Person("John");
p();
不,您不能像普通方法一样调用构造函数p();
而是在实例化对象时调用它,但是是的,您可以通过在ctor
中调用该方法来执行所需的操作,例如
public Person(String _name){
name = _name;
TellMyName();
}
private void TellMyName(){
Console.WriteLine(name);
}