在将属性作为ref传递给函数后,获取.NET中属性的属性

时间:2009-06-15 08:26:51

标签: .net reference-type

是否可以传递属性,例如。 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

2 个答案:

答案 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。