Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.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# 模拟属性Getter使用反射引发异常_C#_Reflection_Moq - Fatal编程技术网

C# 模拟属性Getter使用反射引发异常

C# 模拟属性Getter使用反射引发异常,c#,reflection,moq,C#,Reflection,Moq,我想模拟一个属性,当有人试图从中获取时,我发现该属性使用反射抛出异常。问题是我不知道ID的类型。下面是我尝试过的一个例子: internal static T CreateObjectWithExceptioningIDProperty<T>() where T : class { Type type = typeof(T); var moq = new Mock<T>(); var lambdaParameter = Expression.Parameter

我想模拟一个属性,当有人试图从中获取时,我发现该属性使用反射抛出异常。问题是我不知道
ID
的类型。下面是我尝试过的一个例子:

internal static T CreateObjectWithExceptioningIDProperty<T>() where T : class
{
  Type type = typeof(T);
  var moq = new Mock<T>();
  var lambdaParameter = Expression.Parameter(type);
  PropertyInfo idProperty = type.GetProperties().First(pi => pi.Name.Equals("ID"));
  var lambdaBody = Expression.Property(lambdaParameter, idProperty);
  dynamic func = Expression.Lambda(lambdaBody, lambdaParameter);
  moq.Setup(func).Throws(new Exception()); // get RuntimeBinderException
  return moq.Object;
}
内部静态T CreateObjectWithExceptioningIDProperty(),其中T:class
{
类型=类型(T);
var moq=新模拟();
var lambdaParameter=表达式.参数(类型);
PropertyInfo idProperty=type.GetProperties().First(pi=>pi.Name.Equals(“ID”);
var lambdaBody=Expression.Property(lambdParameter,idProperty);
dynamic func=表达式.Lambda(lambdaBody,lambdaParameter);
moq.Setup(func.Throws(new Exception());//get RuntimeBinderException
返回最小起订量对象;
}
目前,我得到一个
RuntimeBinderException:“object”不包含“Throws”的定义。
。我做错了什么

这类似于和。

可能

moq.Setup( x => x.Id).Throws(new Exception());

如果您将
设置的结果强制转换为
IThrows
,它会工作。我不知道它为什么失败,你是怎么拥有它的;可能是因为
moq.Setup(func)
的运行时类型通常不可见(它是
internal
to
moq


您的
RuntimeBinderException
是因为您不能对
动态
类型使用扩展方法(因为
func
dynamic
moq.Setup(func)
也是)。可能将其强制转换为适当的类型,或者不使用扩展方法语法?这是用于单元测试的吗?如果是的话,它有代码气味。是的,用于单元测试,但是它是一个很长的故事(遗留代码)。你可以考虑增加更多的答案,特别是因为你不确定它是正确的。你看起来不那么肯定。但是我忘了提到在编译时我不会知道属性的名称。我打赌这是因为
Setup()
是一种扩展方法(就像你上面评论的那样)。@MageWind实际上,我不认为
Setup
Throws
是一种扩展方法。当我写评论时,我猜
Throws
是,但我错了。
((IThrows)moq.Setup(func)).Throws(new Exception());