代码之家  ›  专栏  ›  技术社区  ›  user5315444

C#,通用,访问属性

  •  0
  • user5315444  · 技术社区  · 7 年前

    Text 或者物体的任何其他属性,我该怎么做?

    class Methods<T> where T : class
    { 
        bool insertDocument(T content)
        {
            return client.search(content.Text);
        }
    }
    

    我不想使用 Interface

    4 回复  |  直到 7 年前
        1
  •  2
  •   ravindra    7 年前

    这应该适合你。

    class Methods<T> where T : class
    { 
        bool insertDocument(T content)
        {
            var textProperty = typeof(T).GetProperty("Text");
            var searchString = textProperty.GetValue(content).ToString();
            return client.search(searchString);
        }
    }
    
        2
  •  1
  •   ProgrammingLlama Raveena Sarda    7 年前

    我觉得这是一个 XY problem 有一个更好的方法来实现这一点,但这里有一个可能的解决方案。

    如果希望特定属性在泛型类中工作,则应使用此属性创建一个接口,并在使用的类中实现此接口,如:

    class Methods<T> where T : class, ITexted
    { 
        bool insertDocument(T content)
        {
            return client.search(content.Text);
        }
    }
    
    public interface ITexted
    {
        string Text {get; set;}
    }
    
    class UsedClass : ITexted
    {
       public string Text { get; set; }
    }
    

    如果不想使用接口,则不需要泛型类。 您可以像这样使用dynamic:

    class Methods
    { 
        bool insertDocument(dynamic content)
        {
            return client.search(content.Text);
        }
    }
    
        3
  •  0
  •   Ronan Thibaudau    7 年前

    你不能,你指定的唯一约束是“t”应该是“class”,不是所有的类都有“Text”属性,所以你不能访问该属性。你只是误用了泛型(它们不是让单个函数处理所有事情的方法,而是让单个函数处理共享你想要利用的常见行为的对象类型子集的方法,这里你没有指定子集,所以你最终得到了一个相当无用的“T”类型)

        4
  •  0
  •   ProgrammingLlama Raveena Sarda    7 年前

    using System.Linq.Expressions; // include this with your usings at the top of the file
    
    bool insertDocument(T content, Expression<Func<T, string>> textField)
    {
        string text = textField.Compile().Invoke(obj);
        return client.search(text);
    }
    

    然后按如下方式使用:

    class ExampleClass
    {
        public string TestProperty {get;set;}
    }
    

    var example = new ExampleClass() { TestProperty = "hello"; }
    bool result = insertDocument(example, e => e.TestProperty);
    

    但每次都需要指定选择器。至少通过这种方式,您可以使代码保持强类型。

    然而,我建议按照尼古拉斯的回答使用界面。