C# 按类型限制lambda表达式的一部分
我想这样做:C# 按类型限制lambda表达式的一部分,c#,linq,lambda,linq-to-objects,C#,Linq,Lambda,Linq To Objects,我想这样做: public string DoSomething(Expression<Func<int>> expression) { //... } public void CallDoSomething() { var myObj = new MyType(); var result = DoSomething(() => myObj.IntProperty); } 公共字符串DoSomething(表达式) { //... } p
public string DoSomething(Expression<Func<int>> expression)
{
//...
}
public void CallDoSomething()
{
var myObj = new MyType();
var result = DoSomething(() => myObj.IntProperty);
}
公共字符串DoSomething(表达式)
{
//...
}
public void CallDoSomething()
{
var myObj=新的MyType();
var结果=剂量测量(()=>myObj.IntProperty);
}
目标是在“DoSomething()”中完成这三件事:
1) 获取myObj的引用并对其进行处理
2) 获取属性“IntProperty”的名称和值
3) 限制myObj仅为MyType类型
我可以做1和2,但我不知道如何做3
请帮忙
干杯您可以使用
of type()
方法?您正在做的是。。。奇怪的是,我不知道为什么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);
}
公共字符串DoSomething(表达式)
{
//...
}
public void CallDoSomething()
{
var myObj=新的MyType();
var结果=CallHelper(myObj);
}
私有字符串CallHelper(MyType m)
{
返回DoSomething(()=>m.IntProperty);
}
CallHelper为您强制执行类型限制。我不认为有任何方法可以直接在lambda表达式中实现(至少在不更改DoSomething的签名的情况下是这样),但可能我遗漏了一些内容。公共静态字符串DoSomething(expression expression)
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;
}
{
MemberExpression MemberExpression=(MemberExpression)expression.Body;
Type Type=memberExpression.Member.ReflectedType;//MyType
bool check=typeof(MyType).IsAssignableFrom(type);//因此可以检查基类
//如果你想只检查一个类,请执行以下操作
//bool type==typeof(MyType);
如果(!检查)
{
抛出新异常();
}
返回null;
}
这就是你想要的吗?我还没有找到一个解决方案,但现在我只是给DoSomething添加了一行代码,基本上是说如果(myObj.GetType()!=typeof(MyType))…没有IEnumerableIt,我已经在用它作为解决方案,但我认为你比我处理检查的更好(我用的是.GetType()=)。我想要的是一种允许安全地进行编译时检查的方法。更改DoSomething的签名完全可以。但是我不知道如何通过改变签名来解决这个特殊的问题。调用看起来像DoSomething(myObj,()=>myObj.IntProperty);缺点是没有gaurentee认为lambda表达式基于MyType,或者甚至与第一个参数是同一个对象。