【问题标题】:How to get class and property names and values from undeclared type如何从未声明的类型中获取类和属性的名称和值
【发布时间】:2013-03-05 18:59:01
【问题描述】:

如果我有这两个类:

public class A
{
    public int Id { get; set; }
}

public class B
{
    public string Name { get; set; }
}

我可以使用这样的通用方法吗:

public void InitMethod(object classProperty)

像这样传入数据:

var a = new A() { Id = 1 };
var b = new B() { Name = "John" };

InitMethod(a.Id);
InitMethod(b.Name);

并从方法中获取以下信息:

  • 类名(例如:“A”、“B”)
  • 属性名称(例如:“Id”、“Name”)
  • 属性值(例如:1,“John”)

【问题讨论】:

  • 您打算如何处理这些信息?
  • 真正愚蠢的东西 - 生成字符串以作为 SQL 执行以更新数据库。这些类反映了表名和这些表中的列,因此了解所提到的三位信息将有助于初始化,因为它可以在我动态生成我的 SQL 代码时为我提供要更新的表名、列名和值。另一种方法是每次手动传递/初始化值,这会很痛苦。
  • 使用实体框架而不是自己编写怎么样?或者至少使用 LINQ to SQL。
  • 我正在使用 javascript/ajax 来做 - 只是在页面加载时初始化数据。
  • 听起来是个严重的错误。使用实体框架将更容易维护且成本更低。微软已经发明了这种特殊的轮子。

标签: c# asp.net typeof object-type


【解决方案1】:

有点,虽然它可能比它的价值更麻烦。

ASP.Net MVC 经常使用表达式以强类型的方式获取属性信息。表达式不一定会被评估;相反,它会被解析为它的元数据。

这不是 MVC 特有的;我提到它是为了引用 Microsoft 框架中的既定模式。

这是一个从表达式中获取属性名称和值的示例:

// the type being evaluated
public class Foo
{
    public string Bar {
        get;
        set;
    }
}

// method in an evaluator class
public TProperty EvaluateProperty<TProperty>( Expression<Func<Foo, TProperty>> expression ) {
    string propertyToGetName = ( (MemberExpression)expression.Body ).Member.Name;

    // do something with the property name

    // and/or evaluate the expression and get the value of the property
    return expression.Compile()( null );
}

你这样称呼它(注意被传递的表达式):

var foo = new Foo { Bar = "baz" };
string val = EvaluateProperty( o => foo.Bar );

foo = new Foo { Bar = "123456" };
val = EvaluateProperty( o => foo.Bar );

【讨论】:

    【解决方案2】:

    在这个例子中,您需要将对象传递给 InitMethod 而不是该对象的属性,也许它会没问题。

    class Program
    {
        static void Main(string[] args)
        {
            InitMethod(new A() { Id = 100 });
            InitMethod(new B() { Name = "Test Name" });
    
            Console.ReadLine();
        }
    
        public static void InitMethod(object obj)
        {
            if (obj != null)
            {
                Console.WriteLine("Class {0}", obj.GetType().Name);
                foreach (var p in obj.GetType().GetProperties())
                {
                    Console.WriteLine("Property {0} type {1} value {2}", p.Name, p.GetValue(obj, null).GetType().Name, p.GetValue(obj, null));
                }
            }
        }
    }
    

    【讨论】:

    • 在这个例子中你也可以设置属性的值。我做了这样的事情。我有单例配置,在数据库中我有一个表,在表中我有 KEY => VALUE,其中 KEY 是属性名称(我有更多字段......),VALUE 是属性值。数据库由外部系统更改,但我可以自动与之同步。如果我在代码中添加属性,同步将在 db 中插入新行并强制外部系统设置其值...长篇大论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2021-12-04
    • 2016-07-18
    • 2017-05-05
    • 2016-07-29
    • 2012-04-12
    相关资源
    最近更新 更多