1

是否可以传递一个属性,例如。Person.Firstname 通过引用一个函数然后仍然能够通过这个引用类型读取 Person.Firstname 的属性?

那么引用类型是否知道它不仅是一个字符串,还是类 Person 的 Firstname 属性?

蒂亚


我尝试为我的 asp.net mvc 应用程序编写一个扩展,该应用程序使用 jquery.autotab 并将必要的 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
4

2 回答 2

2

将整个引用类型与“as ref”问题放在一边(请参阅我的评论),不 - 没有办法知道值来自于将其作为参数接收的方法中的何处。

可以改为传入表达式树(在 .NET 3.5 中),然后编译/执行树以获取值,并检查树以了解其含义。

但是,这确实是一种设计气味。为什么你需要知道这个?你想达到什么目的?

编辑:请注意,当您在 VB 中通过引用传递属性时(在 C# 中不能这样做),它实际上只是将当前值复制到局部变量,通过引用传递该局部变量,然后复制新值局部变量返回属性。被调用的代码没有表明它最初来自属性。

于 2009-06-15T08:30:24.593 回答
2

使用 MVC,这种Expression方法并不少见。因此,这里有一些示例代码,展示了如何将 an 传递Expression给这样的函数,并获取值和元数据(属性);the 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该重载采用 theExpression...而不是 ,ByRef进行评估(如上)并适当地编写 html。

于 2009-06-15T09:15:48.277 回答