可以訪問TypedConstantExpression
的 '值' 屬性,像這樣:
(expression.Body爲MethodCallExpression).Object.GetType()的getProperty( 「值」)GetMethod.Invoke((expression.Body作爲。 MethodCallExpression).Object,NULL)
當表達由LambdaExpression
()=>(null).GetType()
給出了完整的例子
static readonly Type TypedConstantExpressionType = Type.GetType("System.Linq.Expressions.TypedConstantExpression, System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089");
static readonly PropertyInfo TypedConstantExpressionValueProperty;
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized | System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
static SymbolExtensions()
{
TypedConstantExpressionValueProperty = IntrospectionExtensions.GetTypeInfo(TypedConstantExpressionType).GetProperty("Value");
}
/// <summary>
/// Given a lambda expression that expressed a new object, returns the <see cref="System.Reflection.TypeInfo"/> of what type was expected to be allocated
/// </summary>
/// <param name="expression"></param>
/// <returns></returns>
public static TypeInfo GetTypeInfo(Expression<Action> expression) //Expression<Action> allows the syntax() => where Expression would require a Delgate.
{
Expression body = expression.Body;
if (body is NewExpression)
{
NewExpression newExpression = expression.Body as NewExpression;
return IntrospectionExtensions.GetTypeInfo((expression.Body as NewExpression).Constructor.DeclaringType);
}
else if (body is MemberExpression)
{
MemberExpression memberExpression = body as MemberExpression;
return IntrospectionExtensions.GetTypeInfo(memberExpression.Member.DeclaringType);
}
else if (body is MethodCallExpression)
{
MethodCallExpression methodCallExpression = expression.Body as MethodCallExpression;
if (methodCallExpression.Object is MemberExpression)
{
return IntrospectionExtensions.GetTypeInfo((methodCallExpression.Object as MemberExpression).Member.DeclaringType);
}
//Actually a RuntimeType from a TypedConstantExpression...
return IntrospectionExtensions.GetTypeInfo((Type)TypedConstantExpressionValueProperty.GetMethod.Invoke(methodCallExpression.Object, null));
}
throw new System.NotSupportedException("Please create an issue for your use case.");
}
與下面的類測試和代碼:
public class MyTestClass
{
string m_Test;
public string Test
{
get { return m_Test; }
set { m_Test = value; }
}
}
public class MyTestClass<T> : MyTestClass
{
T Backing;
public T Property
{
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
get { return Backing; }
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
set { Backing = value; }
}
public T AnotherProperty
{
get;
set;
}
}
System.Reflection.TypeInfo typeInfo = Media.Common.Extensions.ExpressionExtensions.SymbolExtensions.GetTypeInfo(() => new MyTestClass<int>());
if (typeInfo.GetGenericArguments()[0] != typeof(int)) throw new System.Exception("Not correct type");
System.Console.WriteLine("TypeInfo.Name" + typeInfo.Name);
System.Console.WriteLine("TypeInfo.MetadataToken" + typeInfo.MetadataToken);
if (typeInfo.GetGenericArguments()[0] != typeof(int)) throw new System.Exception("Not correct type");
typeInfo = Media.Common.Extensions.ExpressionExtensions.SymbolExtensions.GetTypeInfo(() => (typeof(MyTestClass<int>)).GetType());
if (typeInfo.GetGenericArguments()[0] != typeof(int)) throw new System.Exception("Not correct type");
System.Type unboundedType = typeof(MyTestClass<>);
typeInfo = Media.Common.Extensions.ExpressionExtensions.SymbolExtensions.GetTypeInfo(() => (unboundedType).GetType());
System.Console.WriteLine("TypeInfo.Name" + typeInfo.Name);
System.Console.WriteLine("TypeInfo.MetadataToken" + typeInfo.MetadataToken);
來源
2016-06-08 03:23:02
Jay
http://stackoverflow.com/questions/3132981/linq2sql-local-sequence-cannot-be-used-in-linq-to-sql-error 雅不能使用本地序列! – 2013-05-07 14:07:14
請不要忘記提高我的答案! – Jay 2016-06-08 14:53:33
不是說你不能,但它很難...看到我的回答 – Jay 2016-06-08 14:53:54