返回首页


当我是对的。NET反射盛会的事情,我在我以前的专栏中解释工作,我学到了另外一个有趣的事情,Type.InvokeMember。如何传递出或ref参数的方法调用使用Type.InvokeMember?如果你想调用一个方法的原型:

int DoSomething(string someString, int someInt);

,那么你会使用这样的InvokeMember:{C}
或使用一些新的对象[] {...}.变量但你是做什么用的args如果DoSomething的需要out或ref参数?
int DoSomething(out string someString, ref int someInt);

像这样将无法正常工作:
string someText = string.Empty;

int someInt = 0;

object obj = someType.InvokeMember("DoSomething", 

        BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,

        null,

        this,

        new object[] {someText, someInt});

这是棘手的。
object[] args = new object[] { someText, someInt };

object obj = someType.InvokeMember("DoSomething", 

        BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,

        null,

        this,

        args);

甚至令人惊讶的这个工程:
object[] args = new object[2];

// or object[] args = new object[] { null, null };



object obj = someType.InvokeMember("DoSomething", 

 BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance,

 null,

 this,

 args);

访问索引ARGS的值。因此,声明参数对象[]为局部变量解决问题,但我不明白为什么这种行为。也许有人可以解释!{S0}

回答

评论会员:Kubajzz 时间:2012/01/26
有趣的文章,我真的很喜欢阅读,但几乎所有的东西你说我不同意

首先,我不认为的方式获取和set访问器定义可以作出任何更优雅。

这是有道理的,你可以明确定义的存取只有一个知名度。请看下面的例子:
public bool Flag { private get; private set; }
如果你能为get和set访问器的知名度,你可以创建一个类似上面的属性。这些财产是公有的,但它的存取私人。这意味着该属性是可见的"外部世界",但它不能被读取和写入,因此是绝对没用的... ...并宣布整个私有财产会做相同的。

它也是情理之中的获取和设置可见性修饰符必须更多restrictibe属性修饰符。看这个例子:
private bool Flag { public get; set; }
上面的代码违反了规则,即使它是可以创建一个这样的属性,这将是无用的。如果声明为私有财产,那么整个财产是无形的"外面的世界"。因此,它不使任何意义,它的访问器可见,如果物业本身是无形的。

至于新的语法,你的建议,我再次不同意。无论如何,这个职位已经太长了,所以... ...再次感谢有趣的阅读和有一个愉快的一天
评论会员:VivekRagunathan 时间:2012/01/26


我想有一件事,你有弄错或可能是我本来可以更清晰的 - 可访问性修饰符应该是指定的存取或财产申报,但不能同时。例如,

bool Flag { public get; private set; }

public bool Flag { get; set; }

因此,这不是有效的语法(按照我的建议,然后):

public bool Flag { private get; private set; }

一些闲聊:我写了很久以前当属性存取个别无障碍规范,在C#。我已经习惯了现在的语法。不管怎么说,我很高兴,这是值得你读。
关于
Vivek Ragunathan
{A}
编程是一门艺术。代码是一首诗:
|