-2

如果我有两个类,它们是从一个基类派生的,我怎么能写一个泛型方法,可以操纵两个类的继承属性,所以我不需要写两个方法......

abstract class BaseClass
{
    public int Id { get; set; }
    public string slug { get; set; }
}

public class State:BaseClass
{
    public string StateName{ get; set; }
    public string Description { get; set; }
}

public class City:BaseClass
{
    public string TownName { get; set; }
    public string someOtherProperty{ get; set; }

}

“通用”方法:

public string Slugify( ?????BaseClass???? record)
{
    return record.slug = "...return...something...";
}

像这样调用:

string a = Slugify(my_State_object); <--- not working
string b = Slugify(my_City_object);  <--- not working

谢谢!

编辑:州和市是 EF-CodeFirst 类。最初两者都有 Id 和 slug - 字段。

然后我把它们变成了一个基类,因为我在两个(和其他)表中都有这些。

我想要一个返回 slug 的方法,例如:

public string Slugify(string p, System.Data.Entity.DbSet<Models.BaseRecords> dbSet){ return ...}

叫喜欢

Slugify(text, my_State_object);

Slugify(otherText, my_City_object);

这两个电话都给了我一个“......一些无效的论点......”错误。

对不起,这是从德语 VS2010 翻译过来的

4

5 回答 5

6

你已经给出了答案:

public string Slugify(BaseClass record)
{
    return record.slug = "...return...something...";
}

问题是您的 BaseClass 应该像它的孩子一样易于访问。将其公开,就可以了:

public abstract class BaseClass ...
于 2012-10-23T15:48:04.830 回答
3

这是因为您的abstract基类不是公开的,因此它比它的子类更难访问。将其更改为:

public abstract class BaseClass
{
    public int Id { get; set; }
    public string slug { get; set; }
}

其余的代码都很好。

于 2012-10-23T15:52:13.207 回答
0

我假设每种类型生成 slug 的方式都不同。 State将基于该StateName属性,而City将使用该TownName属性。

我认为这可能是一个更好的方法:

public abstract class BaseClass
{
    public int Id { get; set; }
    public abstract string Slug { get; }
}

public class State:BaseClass
{
    public string StateName{ get; set; }
    public abstract string Slug 
    {
        get 
        {
            return Regex.Replace(StateName, '[^a-zA-Z0-9]', '-');
        }
    }
}
于 2012-10-23T15:52:39.117 回答
0

是什么让你不能简单地访问基类的属性?

Class A
{
    public string Rawr {get; set;}
}

Class B : A
{
    public string Rawr2 { get { return Rawr; } set { Rawr = value; } }
}

var b = new B();
b.Rawr = "asdf"

Console.WriteLine(b.Rawr2);
于 2012-10-23T15:53:10.020 回答
0

尝试这个:

BaseClass baseClass = new BaseClass();
baseClass.slug = "initial value";
Console.WriteLine(baseClass.slug); // displays "initial value"
Slugify(baseClass);
Console.WriteLine(baseClass.slug); // displays "...return...something..."

State state = new State();
state.slug = "initial value";
Console.WriteLine(state.slug); // displays "initial value"
Slugify(state);
Console.WriteLine(state.slug); // displays "...return...something..."

您应该看到您的 Slugify 方法已经可以更改 BaseClass 和 State 类中的属性,只要您去掉问号:

public string Slugify(BaseClass record)  
{
    return record.slug = "...return...something...";  
}
于 2012-10-23T15:54:21.770 回答