Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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# 按类型限制lambda表达式的一部分_C#_Linq_Lambda_Linq To Objects - Fatal编程技术网

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,或者甚至与第一个参数是同一个对象。