2016-03-23 24 views
0

我想制作一个真正通用的类来将对象保存到WCF服务。我得到任何类型的对象并通过反射分析对象的属性。当将对象保存到服务上下文中时,我需要知道,是否必须针对属性调用SetLink(...)方法的DataServiceContextWCF:我必须调用哪种属性类型SetLink

因此,我需要一个方法来找出,如果我不得不打电话SetLink(...)或不。我已经试图自己做:

private bool IsLinkedProperty(PropertyInfo propertyInfo) 
{ 
    return (propertyInfo != null) && propertyInfo.PropertyType.IsClass; 
} 

但是这个函数不适用于字符串属性,也可能用于其他人。有没有人有适合这个的功能?

+0

可以定义确定是否应该调用该方法的标准? – stuartd

+0

你可以在这里找到'SetLink'method:[link](https://msdn.microsoft.com/en-us/library/system.data.services.client.dataservicecontext.setlink%28v=vs.113%29的.aspx)。据我所知,所有“原始”数据类型。 – scher

+0

它在我看来,你将需要添加元数据(即属性)到你的属性知道何时调用该方法,以及为参数传递什么。 – stuartd

回答

0

我结束了以下解决方案。我发现在qestion of Nathan Ridley一个提示:

/// <summary> 
/// Helper class for analyzing a type. 
/// </summary> 
public static class TypeAnalyzer 
{ 
    /// <summary> 
    /// Calculates if the given type is a "simple" type. 
    /// </summary> 
    /// <param name="type">Type to be checked for simplicity.</param> 
    /// <returns>True, if the type is "simple";false otherwise.</returns> 
    /// <remarks> 
    /// The following types are assumed to be simple: 
    /// <list type="*"> 
    ///  <item>string</item> 
    ///  <item>int</item> 
    ///  <item>decimal</item> 
    ///  <item>float</item> 
    ///  <item><see cref="StringComparison"/> (enum type)</item> 
    ///  <item>int? (nullable simple types)</item> 
    /// </list> 
    /// The following types are not simple: 
    /// <list type="*"> 
    ///  <item>Point (struct)</item> 
    ///  <item>Point? (nullable struct)</item> 
    ///  <item>StringBuilder (class)</item> 
    /// </list> 
    /// </remarks> 
    public static bool IsSimple(this Type type) 
    { 
     if (IsNullableType(type)) 
      return IsNestedTypeSimple(type); 

     return type.IsPrimitive 
      || type.IsEnum 
      || type.Equals(typeof(string)) 
      || type.Equals(typeof(decimal)) 
      || type.Equals(typeof(DateTime)) 
      || type.Equals(typeof(Guid)); 
    } 

    private static bool IsNestedTypeSimple(Type type) 
    { 
     var nestedType = Nullable.GetUnderlyingType(type); 
     return IsSimple(nestedType); 
    } 

    private static bool IsNullableType(Type type) 
    { 
     return Nullable.GetUnderlyingType(type) != null; 
    } 
} 

写在NUnit测试案例有:

[TestFixture] 
public class TypeAnalyzerTests 
{ 
    [TestCase(typeof(string), true)] 
    [TestCase(typeof(int), true)] 
    [TestCase(typeof(decimal), true)] 
    [TestCase(typeof(float), true)] 
    [TestCase(typeof(StringComparison), true)] 
    [TestCase(typeof(int?), true)] 
    [TestCase(typeof(decimal?), true)] 
    [TestCase(typeof(StringComparison?), true)] 
    [TestCase(typeof(object), false)] 
    [TestCase(typeof(Point), false)] 
    [TestCase(typeof(Point?), false)] 
    [TestCase(typeof(StringBuilder), false)] 
    [TestCase(typeof(DateTime), true)] 
    [TestCase(typeof(Guid), true)] 
    [TestCase(typeof(Guid?), true)] 
    public void IsSimple_WhenCalledForType_ReturnsExpectedResult(Type type, bool expectedResult) 
    { 
     var isSimple = TypeAnalyzer.IsSimple(type); 

     Assert.That(isSimple, Is.EqualTo(expectedResult)); 
    } 
} 

最后我改变了在问题中提到的方法:

private bool IsLinkedProperty() 
{ 
    return (_propertyInfo != null) && !_propertyInfo.PropertyType.IsSimple(); 
} 
相关问题