我需要获取表达式参数的名称.我想要做的是类似于FluentNhibernate对列映射的作用:
地图(x => x.Name)
由此,我需要"名字".
我该怎么做呢?
我可以x这样做:
Expression<Func<User, object>> exp = x => x.Id;
exp.Parameters[0].Name;
Run Code Online (Sandbox Code Playgroud)
但我无法得到"名字".请注意,我没有任何可以调用的T实例.谢谢
我们知道你可以Func<T>像这样指向一个构造函数:
Func<MyObject> constructor = () => new MyObject();
var newObject = constructor();
Run Code Online (Sandbox Code Playgroud)
但有没有办法为你知道从MyObject继承的对象制作一个构造函数,但你不知道它的确切类型?
Type inheritedObjectType = obj; // Parameter
Func<MyObject> constructor = () => new MyObject(); // as inheritedObjectType
var newInheritedObject = constructor; // Should now be of the inherited type
Run Code Online (Sandbox Code Playgroud)
使用Activator或返回任何东西的答案都不Object是一种选择.
编辑:我不知道派生类型在编译时是什么类型.我只有一个System.Type.
首先,我知道我可以定义两个重载的辅助方法来做我需要的东西(或者甚至只是用不同的名称定义两个Func <>),但这些只用于一个公共方法,所以我正在探索方法定义两个本地Func <>,它们也使用相同的名称重载.举个例子:
string DisplayValue(int value)
{ return DisplayValue(value, val => val.ToString()); }
string DisplayValue(int value, Func<int, string> formatter)
{ return (value < 0) ? "N/A" : formatter(value); }
Run Code Online (Sandbox Code Playgroud)
我需要在我的公共方法中多次调用一个或另一个版本来自定义格式化特殊值,所以我想我可以将上面的"翻译"成这样的东西:
Func<int, Func<int, string>, string> displayValue =
(value, formatter) => (value < 0) ? "N/A" : formatter(value);
Func<int, string> displayValue =
value => displayValue(value, val => val.ToString());
Run Code Online (Sandbox Code Playgroud)
即使在我输入它时,我也知道我无法声明两个具有相同名称的委托标识符,即使它们是不同的类型.这比使用Func <> s实现重载的死机更为学术,但我猜他们不能做任何事情,对吧?
而且我想你不能做这样的事情:
Func<string, params object[], string> formatArgs =
(format, args) => string.Format(format, args);
Run Code Online (Sandbox Code Playgroud) 我有这段代码,它接受一个没有参数的函数,并返回它的运行时.
public static Stopwatch With_StopWatch(Action action)
{
var stopwatch = Stopwatch.StartNew();
action();
stopwatch.Stop();
return stopwatch;
}
Run Code Online (Sandbox Code Playgroud)
我想将其转换为带参数的非void函数.我听说过Func <>委托,但我不知道如何使用它.我需要这样的东西(非常伪):
public T measureThis(ref Stopwatch sw, TheFunctionToMeasure(parameterA,parameterB))
{
sw.Start(); // start stopwatch
T returnVal = TheFunctionToMeasure(A,B); // call the func with the parameters
stopwatch.Stop(); // stop sw
return returnVal; // return my func's return val
}
Run Code Online (Sandbox Code Playgroud)
所以我必须得到传递的func的返回值,并最终获得秒表. 任何帮助是极大的赞赏!
我有一个服务的方法需要两个Actions,一个用于成功,一个用于失败.每个Action都带有一个包含附加信息的Result参数......
void AuthoriseUser(AuthDetails loginDetails,
Action<AuthResult> onSuccess,
Action<AuthResult> onFailure);
Run Code Online (Sandbox Code Playgroud)
我正在为依赖于该服务的类编写单元测试,我想测试这个类在onSuccess(...)和onFailure(...)回调中做了正确的事情.这些是私有或匿名方法,那么如何设置模拟服务来调用Action?
正如在这个问题中提到的,期望a的方法Func不接受F#函数值.
重载一个方法以便接受F#函数值的好方法是什么?
我有这个方法
public static T F<T>(T arg)
{
return arg;
}
Run Code Online (Sandbox Code Playgroud)
我想为F创建一个Func委托.我试试这个
public Func<T, T> FuncF = F;
Run Code Online (Sandbox Code Playgroud)
但它在语法上并不正确.我怎么能这样做
想法是在函数中修补对ggplot的调用.
这个例子:
library(dplyr)
library(ggplot2)
library(lazyeval)
df <- data.frame(A=letters[1:10], B=2:11, C=3:12))
func <- function(name, dat=df) {
output <- dat %>%
select_(~A,name) %>%
arrange_(interp(~desc(var), var=as.name(name)))
plot <-
ggplot(output, aes_string(x=reorder(~A,-name), y=B)) +
geom_bar(stat='identity')
print(plot)
return(plot)
}
result <- func("B")
Run Code Online (Sandbox Code Playgroud)
编译给出:
-name中的错误:一元运算符的无效参数.
我试着deparse和substitute.不确定我是否得到了正确的组合.有任何想法吗?
我与Dapper一起工作,我尝试为内部联接创建自动映射的方法。
这是模型的示例:
public class User
{
public long IdUser { get; set; }
public string Email { get; set; }
}
public class Page
{
public long Id { get; set; }
public string Name { get; set; }
public long IdUserCreatedPage { get; set; }
public User UserCreatedPage { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是查询:
SELECT * FROM "PAGE" INNER JOIN "USER" ON "PAGE"."IdUserCreatedPage" = "USER"."IdUser"
Run Code Online (Sandbox Code Playgroud)
如果我手动编写代码,我会这样写:
public List<Page> GetPage(IDbConnection dbConnection, string sql)
{
return (List<Page>)dbConnection.Query<Page, User, Page>(sql,
(Page p, …Run Code Online (Sandbox Code Playgroud) 我想将字符串lambda表达式转换为Func,但我有以下错误:"类型'字符串'中没有属性或字段'v'".
var func = System.Linq.Dynamic.DynamicExpression.ParseLambda<string, string>("v => v.ToLower()").Compile();
var outputValue = func(inputValue);
Run Code Online (Sandbox Code Playgroud)