如果一个对象的属性(值类型)作为一个方法的参数,那么在方法里面能不能取得传入属性的特性?
很是困惑这个问题,我想在方法里面知道某一个参数的调用者是谁,比如取得传入该参数的特性信息,C#能不能做到呢?Lisp 好像都可以的,他把参数都当作表达式,而不仅仅是一个值。
最近作一个项目,需要用到该特性,不知道能否用。NET做到,请CSDN的大牛指点!!!

解决方案 »

  1.   

    我知道反射可以查询到对象属性的特性,但这个语义上看起来很不舒服吧?比如有一个对象,login,属性UserName,该属性有一个特性DataType=String,现在类的外部有一个方法GetNewTable,它有一个参数,接受一个String类型的值,但我同时想知道这个值是谁给的,以便根据不同的参数传送人采取不同的处理,这里可以采用下面的方式:
    GetNewTable(typeof(login.UserName))
    但是如果我的参数要接受很多参数,每个参数都要这个typeof,看起来是不是很不舒服?而且typeof 反射效率是比较低下的。
    为啥不能这样呢?
    GetNewTable(login.UserName)
    大家可能说将属性username作为一个对象而不是一个值类型处理,不错,可以这样,但是如果我要取login.UserName的值怎么办?将UserName再增加一个属性Value,象这样:login.UserName.Value .
    这样做不可避免的产生下面的问题:
    1,UserName属性是一个引用对象,为了描述login对象所有的属性,势必这个所属对象的Value属性是Object类型的?这样做在真正需要取得这个Value值的时候,不停的进行装箱/拆箱处理,效率太慢了。
    2,login.UserName属性在数据邦定控件进行数据绑定的时候如何处理?以上问题搞了很久都不明白,请CSDN的大牛你们指点!·!
      

  2.   

    StackTrace 和 StackFrame
    StackTrace:表示一个堆栈跟踪,它是一个或多个堆栈帧的有序集合。
    StackFrame:提供关于 StackFrame(表示当前线程的调用堆栈中的一个函数调用)的信息。
    使用这两个类应该可以实现。
    没做过哦
      

  3.   

    以我目前对C#的了解来看,楼主的需求是实现不了的。楼主传入的是一个值类型数据,在进入函数调用时,CLR只是复制了一个值而已,
    已经丢失了其宿主对象的信息了,不可能通过一个值找到其所属的对象了。不知道事实上是不是这样的,接着听楼下的解释了。
      

  4.   

    bbdog:如果我的方法参数是 ref 形式的,可以吗?
      

  5.   

    我估计也不行,ref也只是对那个数值做了个简单的包装,还是没有宿主对象的信息。
      

  6.   

    把 MemberInfo作为参数传值进去