我想做这样的事情:
public string DoSomething(Expression<Func<int>> expression)
{
//...
}
public void CallDoSomething()
{
var myObj = new MyType();
var result = DoSomething(() => myObj.IntProperty);
}
目标是在“DoSomething()”中执行以下三项操作: 1)获取对myObj的引用并使用它做一些事情 2)获取属性“IntProperty”的名称和值 3)将myObj限制为仅属于MyType类型
我可以做1和2,但我无法弄清楚如何做3!
请帮忙。
干杯
答案 0 :(得分:1)
您可以使用OfType<T>()
方法吗?
答案 1 :(得分:1)
public static string DoSomething(Expression<Func<int>> expression)
{
MemberExpression memberExpression = (MemberExpression)expression.Body;
Type type = memberExpression.Member.ReflectedType; // MyType
bool check = typeof(MyType).IsAssignableFrom(type); // So you could check for base class
// If you want to check for exactly one class, do
// bool type == typeof(MyType);
if (!check)
{
throw new Exception();
}
return null;
}
这是你想要的吗?
答案 2 :(得分:0)
你正在做的是......很奇怪,我不知道为什么GetType解决方案是不可接受的,但是你可以用另一层实现类似的东西:
public string DoSomething(Expression<Func<int>> expression)
{
//...
}
public void CallDoSomething()
{
var myObj = new MyType();
var result = CallHelper(myObj);
}
private string CallHelper(MyType m)
{
return DoSomething(() => m.IntProperty);
}
CallHelper会为您强制执行类型限制。我认为没有办法直接在lambda表达式中做到这一点(至少在没有改变DoSomething的签名的情况下),但也许我错过了一些东西。