型付データセットをインターフェース越しに扱う

型付データセットが大好きなので出来る限り型付データセットだけでいろいろなことを済ませたい。
済ませたいんですが、Partialクラスにメソッド追加して便利にしていくだけだと余分なところが隠せないのでインターフェース越しに扱うのはどうなのかなー、という話を書きます。
もっと簡単に同じような動きを実現できるのではないのかなーと思いつつ出来てない……。なんか、メジャーなやり方があるんでしょうか……。
たとえば、こういうテーブルがあったとして、

CHAR(1)である、sex列には0:男性、1:女性というフラグが入るとします。それ以外の値は入れてほしくないので、SEXという列挙体を定義して、その列挙体でsexカラムを扱えるようにします。なんか紛らわしいですが、SEXが列挙体の型名で、sexが自動生成されたDataRowのカラム、SexがPartialクラスに定義したプロパティです。ちなみに、sexというのは英語で性別という意味です。
ついでに、姓 + 名を返してくれる、読み取り専用のFullNameというプロパティも定義しています。

これで、以下のように、Sexには特定の値しか設定できないようになりました。

しかし、自動生成されたsexプロパティのほうにも依然としてアクセスできるので、こいつに直接値を設定することで、"0"、"1"以外の好きな値、"x"などを入れられます。そして、次回Sexプロパティにアクセスしたとき、Enum.Parseが出来なくて死ぬ……(死にません。例外が出る)。
sexに直接値が入れられる以外にも、CustomerRowにはDataRowから継承した、データアクセス層以外からは触るべきでないようなものがいっぱい公開されてて、そいつらには触れないようにしたい。

↑なんかよくわかないのが一杯出るけど全然いらない。そこで、公開したいメンバだけ設定したインターフェースを定義して、こいつ越しに扱うルールにしてみます。名前は、ICustomerDataRowです。普段は名前にIとかつけませんが考えるのが面倒だったので……。

こんな感じで、使いたい奴だけ出てくるようになりました。

しかし、このままだと、CustomerDataTableからインデクサや、Select、foreachで取り出した時に毎回CustomerRowではなく、ICustomerRowとして扱うのを忘れないようにしないといけないので、最初からICustomerRowで返してくれる、ICustomerDataTableというのも定義してみる。

CustomerDataTableは使わせないで、ICustomerDataTableだけでまわそうとすると、最低限NewRow系やらも使えるようにしておかねばならず面倒くさい……。あと、型付データテーブルのインターフェースが必要なのと同じ理由で、型付データセットに対応するインターフェースも定義した方が良い、とかいうことになる……。
まぁ、面倒だけど定型的な作業は自動化するか、新人にやらせろ、という格言もあるので行けるのかなぁー。データアクセス層だけアセンブリ分けるときは、DataSet自体はinternalにしてinterfaceだけパブリック、とかにすることもあるんでしょうか。知りませんが……。