C#获取操作中指定的属性类型

C#获取操作中指定的属性类型,c#,action,gettype,C#,Action,Gettype,我必须创建类似于Fluent的API。我必须: public class Foo{public string Bar{get;set;}} 我需要提供一些属性(例如列名): new MyFluentApi().ColumnAttributes(**p=>p.Bar**).ColumnName(“一些很长的列名,其中有条形值”) 在ColumnAttributes中,我需要获取指定属性的类型/名称,但如何获取?在表达式p=>p.Bar中,我得到了Bar的实际值,但我需要这样的类型: public

我必须创建类似于Fluent的API。我必须:
public class Foo{public string Bar{get;set;}}

我需要提供一些属性(例如列名):

new MyFluentApi().ColumnAttributes(**p=>p.Bar**).ColumnName(“一些很长的列名,其中有条形值”)
在ColumnAttributes中,我需要获取指定属性的类型/名称,但如何获取?在表达式p=>p.Bar中,我得到了Bar的实际值,但我需要这样的类型:

public static MyFluentApi<T> ColumnAttributes<T>(this MyFluentApi<T> api,
    Expression<Func<T, object>> selector)
{
    var expression = (MemberExpression)selector.Body; // Assume expression is accessing a member of T
    var prop = (PropertyInfo)expression.Member; // Assume said member is a property
    var type = prop.PropertyType; // Get the type of property

    // Do something with type

    return api;
}
公共静态MyFluentApi列属性(此MyFluentApi,
表达式选择器)
{
var expression=(MemberExpression)selector.Body;//假设表达式正在访问T的成员
var prop=(PropertyInfo)expression.Member;//假设所述成员是属性
var type=prop.PropertyType;//获取属性的类型
//用字体做某事
返回api;
}
请注意,如果lambda不是直接的属性访问,则会引发异常

另一种方法是使用类型推断:

public static MyFluentApi<T> ColumnAttributes<T, TProp>(this MyFluentApi<T> api,
    Expression<Func<T, TProp>> selector)
{
    var type = typeof(TProp);

    // Do something with type

    return api;
}
公共静态MyFluentApi列属性(此MyFluentApi,
表达式选择器)
{
变量类型=类型(TProp);
//用字体做某事
返回api;
}
现在,这应该适用于任何表达式,无论是否访问属性,这可能是您想要的

例如,这将毫无例外地运行:

new MyFluentApi<Foo>().ColumnAttributes(p => new object());
newmyfluentapi().ColumnAttributes(p=>newobject());
像这样:

public static MyFluentApi<T> ColumnAttributes<T>(this MyFluentApi<T> api,
    Expression<Func<T, object>> selector)
{
    var expression = (MemberExpression)selector.Body; // Assume expression is accessing a member of T
    var prop = (PropertyInfo)expression.Member; // Assume said member is a property
    var type = prop.PropertyType; // Get the type of property

    // Do something with type

    return api;
}
公共静态MyFluentApi列属性(此MyFluentApi,
表达式选择器)
{
var expression=(MemberExpression)selector.Body;//假设表达式正在访问T的成员
var prop=(PropertyInfo)expression.Member;//假设所述成员是属性
var type=prop.PropertyType;//获取属性的类型
//用字体做某事
返回api;
}
请注意,如果lambda不是直接的属性访问,则会引发异常

另一种方法是使用类型推断:

public static MyFluentApi<T> ColumnAttributes<T, TProp>(this MyFluentApi<T> api,
    Expression<Func<T, TProp>> selector)
{
    var type = typeof(TProp);

    // Do something with type

    return api;
}
公共静态MyFluentApi列属性(此MyFluentApi,
表达式选择器)
{
变量类型=类型(TProp);
//用字体做某事
返回api;
}
现在,这应该适用于任何表达式,无论是否访问属性,这可能是您想要的

例如,这将毫无例外地运行:

new MyFluentApi<Foo>().ColumnAttributes(p => new object());
newmyfluentapi().ColumnAttributes(p=>newobject());

如何定义列属性?它应该有一个
Expression
类型的参数。如果您确切指定了
ColumnAttributes
是什么,这个问题会更好。论点是什么?有些人可能认识它,但我不认识。一旦有了这些,剩下的就更容易了。列属性是如何定义的?它应该有一个
Expression
类型的参数。如果您确切指定了
ColumnAttributes
是什么,这个问题会更好。论点是什么?有些人可能认识它,但我不认识。如果我们调用一个虚拟方法,比如
p=>p.VirtualMethod()
,那么对象的静态类型是T,而动态类型是TDerived呢。如何使用
GetType
访问派生类型?谢谢。@N.Dogac你是说获取运行时类型?您可以直接使用委托,例如
Func
,调用该委托并对结果使用
GetType()
。如果签名类似于
Func
,委托将需要键入一个参数T,并且委托调用可能会在程序中产生副作用。我们能在不调用委托的情况下实现这一点吗?@N.Dogac这是
MyFluentApi
的扩展方法,因此
T
永远不能
T派生
(除非
MyFluentApi
是协变接口)。如果
TProp
在运行时引用派生类型,获取该类型的唯一方法是访问对象并使用反射检查其类型。如果我们调用一个虚拟方法,如
p=>p.VirtualMethod()
并且对象的静态类型是T,但如果TDerived是对象的动态类型,该怎么办。如何使用
GetType
访问派生类型?谢谢。@N.Dogac你是说获取运行时类型?您可以直接使用委托,例如
Func
,调用该委托并对结果使用
GetType()
。如果签名类似于
Func
,委托将需要键入一个参数T,并且委托调用可能会在程序中产生副作用。我们能在不调用委托的情况下实现这一点吗?@N.Dogac这是
MyFluentApi
的扩展方法,因此
T
永远不能
T派生
(除非
MyFluentApi
是协变接口)。如果
TProp
在运行时引用了派生类型,则获取该类型的唯一方法是访问该对象并使用反射检查其类型。