Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从未声明的类型中获取类和属性名称及值_C#_Asp.net_Typeof_Object Type - Fatal编程技术网

C# 如何从未声明的类型中获取类和属性名称及值

C# 如何从未声明的类型中获取类和属性名称及值,c#,asp.net,typeof,object-type,C#,Asp.net,Typeof,Object Type,如果我有这两门课: 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" }; InitMe

如果我有这两门课:

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);
要像这样传入数据,请执行以下操作:

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”、“名称”)
  • 财产价值(例如:1,“约翰”)

算是吧,尽管这可能会带来更多的麻烦

Net MVC经常使用表达式以强类型方式获取属性信息。表达式不一定得到计算;而是对其元数据进行分析

这不是MVC特有的;我提到它是为了引用微软框架中的一个既定模式

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

// 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 );
}

在本例中,您需要将对象传递给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));
            }
        }
    }
}

你打算用这些信息做什么?真是愚蠢的事情——生成字符串作为SQL执行以更新数据库。这些类反映了表名和这些表中的列,因此了解上面提到的三位信息将有助于初始化,因为它可以在动态生成SQL代码时为我提供要更新的表名、列名和值。另一种方法是每次手动传递/初始化值,这将是一种痛苦。使用实体框架而不是编写自己的框架如何?或者至少使用LINQtoSQL。我是用javascript/ajax做的——只是在pageload上初始化数据。听起来像是一个严重的错误。使用实体框架将更容易、更便宜地维护。Microsoft已经发明了这个特殊的轮子。在这个例子中,您还可以设置属性的值。我做过这样的事。我有单例配置,在DB中我有一个表,在表中我有KEY=>VALUE,其中KEY是属性名(我有更多的字段…),VALUE是属性的值。DB由外部系统更改,但我可以自动与之同步。若我在代码中添加属性,同步将在db中插入新行,并强制外部系统设置其值。。。说来话长。