C#获取操作中指定的属性类型
我必须创建类似于Fluent的API。我必须: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
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
在运行时引用了派生类型,则获取该类型的唯一方法是访问该对象并使用反射检查其类型。