是否可以传递属性,例如。 Person.Firstname通过引用一个函数然后仍然可以通过这个引用类型读取Person.Firstname的属性?
引用类型也知道它不仅是一个字符串而且还是Person类的Firstname属性吗?
TIA
我尝试为使用jquery.autotab的asp.net mvc应用程序编写扩展,并根据属性将必要的js代码添加到Html.TextBox输出中。
例如
Class Person
<Autotab("text", maxlength:= 15)> _
Property Firstname() as String
...
End Property
End Class
<%= Html.TextBoxAutoTab("Person.Firstname", p.Firstname) %>
TextBoxAutoTab的签名如下所示
Public Function TextBoxAutoTab(ByVal h As HtmlHelper, ByVal name As String, ByRef value As Object) As String
答案 0 :(得分:2)
将整个引用类型与“as ref”问题放在一边(参见我的评论),不 - 没有办法在一个接收它作为参数的方法中告知值的来源。
你可以传递一个表达式树(在.NET 3.5中),然后编译/执行树来获取值,并检查树以找出它的含义。
然而,这确实是一种设计气味。为什么你需要知道这个?你想要实现什么目标?
编辑:请注意,当您在VB中通过引用传递属性(您无法在C#中执行)时,它实际上只是将当前值复制到局部变量,通过引用传递该局部变量,然后复制新的返回属性的局部变量的值。被调用的代码没有表明它最初来自一个属性。
答案 1 :(得分:2)
使用MVC Expression
方法并不少见;因此,这里有一些示例代码,展示如何将Expression
传递给这样的函数,并获取值和元数据(属性); Expression<Func<object>>
(或类似)替换ref
参数:
(抱歉,例如C# - 我的VB不够强大,无法尝试)
static void Main()
{
Person p = new Person { FirstName = "abc" };
MyMethod(() => p.FirstName);
}
public static void MyMethod(Expression<Func<object>> expression)
{
object value = expression.Compile()();
Console.WriteLine("value is: " + value);
switch (expression.Body.NodeType)
{
case ExpressionType.MemberAccess:
var me = (MemberExpression)expression.Body;
AutotabAttribute attrib = (AutotabAttribute)
Attribute.GetCustomAttribute(
me.Member, typeof(AutotabAttribute));
if (attrib != null)
{
Console.WriteLine("maxlength is: " + attrib.maxlength);
Console.WriteLine("text is: " + attrib.text);
}
break;
default:
throw new NotSupportedException("Expression is too complex");
}
}
所以你必须写一个TextBoxAutoTab
的重载,它取Expression...
而不是ByRef
,进行评估(如上所述)并适当地写入html。