【发布时间】:2014-02-14 06:02:40
【问题描述】:
我有不同的属性可以提供一个值,我想返回第一个满足指定条件的属性。
问题是当其中一个源是class 和null 时,我确实得到了一个不错的对象引用,没有设置为对象的实例。。
无论是在Func<T,bool> 还是Expression<Func<Media,T>>,我都找不到一个属性来检查当前提供程序的无效性。
你知道如何检查函数目标的无效性吗?
public int TempoInteger
{
get
{
double result;
// In this case, AudioSummary is a class that can be null
if (TryGetValue(out result, s => s > 0.0d, s => s.TempoBass, s => s.AudioSummary.Tempo))
{
return (int)Math.Round(result);
}
return -1;
}
}
private AudioSummary AudioSummary {get; set;}
/// <summary>
/// Tries to get a value from multiple expressions, first expression value that satisfies the predicate will be returned. If no value satisifes the predicate the default value of <typeparamref name="T"/> will be returned.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="result"></param>
/// <param name="predicate"></param>
/// <param name="expressions"></param>
/// <returns></returns>
private bool TryGetValue<T>(out T result, Func<T, bool> predicate, params Expression<Func<Media, T>>[] expressions)
{
foreach (var expression in expressions)
{
Func<Media, T> func = expression.Compile();
// 'System.NullReferenceException' occurs here when AudioSummary is null
T t = func(this);
var b = predicate(t);
if (b)
{
result = t;
return true;
}
}
result = default(T);
return false;
}
public sealed class AudioSummary
{
[JsonProperty("tempo")]
public double Tempo { get; set; }
// ...
}
【问题讨论】:
-
我在代码中没有看到
AudioSummary,除了cmets.. -
我已将属性添加到代码中,并对类进行了修剪定义。