我有以下方法
Func<string,IEnumerable<dynamic>> getLpVideos = delegate(string language)
{
var id = GetBy(language);
return new List();
};
我想将这样的参数传递给泛型方法,但我对如何在 GetObjectFromMemoryCacheWithDefParams 中使用此参数以及如何调用 GetObjectFromMemoryCacheWithDefParams :
public T GetObjectFromMemoryCacheWithDefParams<T>(
string key, Func<string, T> defGetValueFunc) where T : class
{
var result = _cache.Get(key) as T;
return result ?? defGetValueFunc();//here error
}
//The type arguments for method cannot be inferred from the usage
var result = CacheService
.GetObjectFromMemoryCacheWithDefParams(casheName, getLpVideos(lng));
仅当明确提供type参数时才有效。
答案 0 :(得分:2)
您没有按预期传递Func<string, T>
。您正在传递IEnumerable<dynamic>
,而这是在运行时评估的动态表达式。请注意getLpVideos(lng)
不是函数,它是函数 调用,这意味着它的返回值用作第二个参数而不是功能本身。你需要这个:
var result = CacheService
.GetObjectFromMemoryCacheWithDefParams(casheName, getLpVideos);
此外,您需要在GetObjectFromMemoryCacheWithDefParams
方法中修复您的函数调用 - 它需要一个您不提供的输入参数:
所以改变这个:
return result ?? defGetValueFunc();
到此:
return result ?? defGetValueFunc(key);
答案 1 :(得分:1)
如果我正确理解您的问题,您只需要接听电话即可。在这种情况下
你只需要明确告诉它T
是什么类型。在你的情况下是IEnumerable<dynamic>
。所以你可以打电话
var result = CacheService.
GetObjectFromMemoryCacheWithDefParams<IEnumerable<dynamic>>(
casheName,
getLpVideos(lng)
);
答案 2 :(得分:1)
您需要将字符串传递给defGetValueFunc并明确指定T的类型
public T GetObjectFromMemoryCacheWithDefParams<T>(string key, Func<string,T> defGetValueFunc) where T : class
{
var result = _cache.Get(key) as T;
return result ?? defGetValueFunc(*somestring*);
}
var result = CacheService.GetObjectFromMemoryCacheWithDefParams<IEnumerable<dynamic>>(casheName, getLpVideos(lng) );
答案 3 :(得分:1)
您确定这正是您要编译的代码吗?错误实际上恰好发生在您所说的位置吗?
如果是这样,那么在我看来,您的代码的问题在于您根本没有正确调用委托参数。您正在传递一个委托实例,该实例需要传递一个string
参数。但是在您的代码中,您没有传递任何参数:
public T GetObjectFromMemoryCacheWithDefParams<T>(
string key, Func<string, T> defGetValueFunc) where T : class
{
var result = _cache.Get(key) as T;
return result ?? defGetValueFunc(--> you need a parameter here! <--);//here error
}
我不知道你应该传递什么参数,因为你在帖子中包含的匿名方法甚至不使用参数(除了检索被忽略的值) 。但你必须传递一些东西。
我认为这里的类型推断实际上没有任何问题。这个简单的例子,基本上与你的相同(除了我正确地调用委托)编译得很好:
static T Method<T>(string s, Func<string, T> f) where T : class
{
return f(s);
}
static void OtherMethod()
{
Func<string, IEnumerable<dynamic>> f = l => new List<object>();
Method("foo", f);
}
很明显,在给定正确的代码的情况下,编译器可以推断出正确的类型。 :)