我试图弄清楚如何用反射实例化一个案例类对象.这有什么支持吗?我最接近的是查看scala.reflect.Invocation,但这似乎更适合执行作为对象一部分的方法.
case class MyClass(id:Long, name:String)
def instantiate[T](className:String)(args:Any*) : T = { //your code here }
Run Code Online (Sandbox Code Playgroud)
接近我正在寻找的API.
任何帮助,将不胜感激.
Scala集合api有一些非常有趣的属性,我想知道如何在Haskell中实现它; 或者如果它甚至可能(或者一般来说是一个好主意).我有点像哈斯克尔新手,所以我想听听你的想法.
scala映射定义如下所示:
def map[B, That](f: A => B)(implicit bf: CanBuildFrom[Repr, B, That]): That
Run Code Online (Sandbox Code Playgroud)
此API的一个有趣特性是,如果映射字符串并且map函数返回一个字符,则结果将是string类型(而不是字符列表).
在C#中,我可以使用表达式树很容易地创建对象图的字符串表示.
public static string GetGraph<TModel, T>(TModel model, Expression<Func<TModel, T>> action) where TModel : class
{
var method = action.Body as MethodCallExpression;
var body = method != null ? method.Object != null ? method.Object as MemberExpression : method.Arguments.Any() ? method.Arguments.First() as MemberExpression : null : action.Body as MemberExpression;
if (body != null)
{
string graph = GetObjectGraph(body, typeof(TModel))
return graph;
}
throw new Exception("Could not create object graph");
}
Run Code Online (Sandbox Code Playgroud)
在F#中我一直在看引文试图做同样的事情,并且无法弄明白.我曾尝试使用PowerPack库将引用转换为Expression,但到目前为止还没有运气,而且互联网上的信息在这个主题上看起来相当稀少.
如果输入是:
let result = getGraph myObject <@ myObject.MyProperty @>
Run Code Online (Sandbox Code Playgroud)
输出应为"myobject.MyProperty"
我遇到了F#powerpack报价评估的问题.
open Microsoft.FSharp.Linq.QuotationEvaluation
let print x = System.Console.WriteLine(sprintf "%A" x)
type record = { x:int; y:int }
let val1 = { x = 1; y = 1; }
let val2 = { x = 1; y = 1; }
let result = val1 = val2
print result
let quote = <@ let value1 = { x = 1; y = 1; }
let value2 = { x = 1; y = 1; }
let result2 = value1 = value2
result2 …Run Code Online (Sandbox Code Playgroud)